Fácil carga de imágenes de manera asíncrona en un UITableView utilizando GCD

Después de dos días buscando esta respuesta encontré una solución.

  • Use GCD para download imágenes de forma asíncrona.
  • Utilice NSMutableDictionary para save imágenes en la memory.

Encontré la solución explicada aquí por Duncan C:

http://iphonedevsdk.com/forum/iphone-sdk-development/104438-grand-central-dispatch-tableview-images-from-the-web.html

Cómo implementar:

- (void)viewDidLoad { (...) dispatch_queue_t mainQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); imagesDictionary = [[NSMutableDictionary alloc] init]; (...) } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { (...) NSData *imageData = [imagesDictionary objectForKey:@"IMAGE URL"]; if (imageData) { UIImage* image = [[UIImage alloc] initWithData:imageData]; imageFlag.image = image; NSLog(@" Reatriving ImageData...: %@", @"IMAGE URL"); } else { dispatch_async(mainQueue, ^(void) { NSString *url = @"IMAGE URL"; NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]]; UIImage* image = [[UIImage alloc] initWithData:imageData]; imageFlag.image = image; [imagesDictionary setObject:imageData forKey:@"IMAGE URL"]; NSLog(@" Downloading Image...: %@", @"IMAGE URL"); }); } (...) } 

El proyecto en GitHub: https://github.com/GabrielMassana/AsynchronousV2.git

Sé que si el proyecto es grande y con muchas células puedo quedarme sin memory. Pero creo que esta solución es un buen acercamiento para un novato.

¿Qué opinas del proyecto? Si el proyecto es realmente grande, ¿la mejor opción es save las imágenes en el disco? Pero entonces el problema es la posibilidad de quedarse sin memory en el disco, ¿no? Quizás, entonces, necesitamos un mecanismo para eliminar todas las imágenes del disco.

Use NSCache para save sus imágenes descargadas en lugar de NSDictionary. Esto se gestionará en situaciones de baja memory y eliminará los elementos a los que no se haya accedido durante un time. En esa situación, se cargarán desde la URL nuevamente si es necesario.