He visto algunas de las presentaciones de WWDC 2010 y también he leído la mayoría de los documentos sobre bloques y simultaneidad y tengo algunas preguntas sobre el uso de bloques con colas en serie en Grand Central Dispatch. Tengo un proyecto de iOS 4 que tiene una vista de desplazamiento y un diccionario de información de imagen: direcciones URL de las imágenes, etc. Quiero usar GCD y bloques para descargar las imágenes y ponerlas en mi scrollview, sin bloquear el hilo principal. He writen el siguiente código que parece funcionar:iOS 4 GCD questions
for (NSDictionary* dict in images)
{
dispatch_async(image_queue, ^{
NSString* urlString = [dict objectForKey:@"url"];
NSURL* url = [NSURL URLWithString:urlString];
NSData* imageData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* image = [UIImage imageWithData:imageData];
UIImageView* imageView = // initialize imageView with image;
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:imageView];
});
[imageData release];
});
}
Tengo dos preguntas:
De acuerdo con la guía de concurrencia que no debería capturar variables del ámbito de inclusión que son tipos no escalares - en mi código, capturo el dict que es un objeto NSDictionary *. Si no puedo capturarlo, ¿cómo debo escribir el código? ¿Un bloque solo captura variables del ámbito adjunto que se utilizan realmente?
¿Qué sucede si dejo ViewController actual antes de que todas las imágenes se obtengan a través de la cola de envío en serie? No creo que sean conscientes de que el ViewController que los creó se ha ido, así que ¿qué sucede cuando ejecutan el controlador de finalización donde inserto las vistas de imagen en mi scrollview en el hilo principal? ¿Causa un error o qué? ¿Y cómo puedo cancelar cualquier operación restante en la cola serie cuando desaparece mi ViewController?
Saludos,
Me gustaría ver algunas de las mejores prácticas en esto también. –