Cargar imágenes para UITableViewCell desde URL (es necesario cargarlas de forma asíncrona)

Tengo una class personalizada que analiza a través de un XML y obtiene cadenas de URL para imágenes (que guardo en una matriz). Luego quiero recuperar esas cadenas para cargar imágenes y mostrarlas en una UITableViewCell. Aquí está mi código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; UILabel *labelText = (UILabel *)[cell viewWithTag:1000]; labelText.text = [[self.listOfPlaceDetails objectAtIndex:indexPath.row] objectForKey:@"name"]; NSURL *imageURL = [NSURL URLWithString:[[self.listOfPlaceDetails objectAtIndex:indexPath.row]objectForKey:@"imageCell"]]; NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; UIImage *image = [UIImage imageWithData:imageData]; cell.imageView.image = image; return cell; } 

Obviamente, cuando me desploop hacia abajo, la aplicación carga más imágenes y, cuando las imágenes se cargan, el usuario no puede hacer nada. Parece que la aplicación se congeló. Las imágenes que quiero cargar no son muy grandes (alnetworkingedor de 8kb). ¿Tal vez hay una manera de cargarlos y almacenarlos en el background? También quiero dar más libertad al usuario, como desplazarse hacia abajo y ver las celdas con text, pero sin una image. Luego fuerce la aplicación para cargar las imágenes de las celdas que el usuario está viendo actualmente.

¿Hay alguna forma de modificar mi código o cualquier otra solución para cargar correctamente las imágenes de las cadenas URL?

Cualquier consejo sería apreciado, gracias.

Use esto para la forma asíncrona de cargar imageview

  - (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; UILabel *labelText = (UILabel *)[cell viewWithTag:1000]; labelText.text = [[self.listOfPlaceDetails objectAtIndex:indexPath.row] objectForKey:@"name"]; //get a dispatch queue dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //this will start the image loading in bg dispatch_async(concurrentQueue, ^{ NSURL *imageURL = [NSURL URLWithString:[[self.listOfPlaceDetails objectAtIndex:indexPath.row]objectForKey:@"imageCell"]]; NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL]; //this will set the image when loading is finished dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [UIImage imageWithData:image]; }); }); return cell; } 

Intente cargar las imágenes asíncronas, por lo que el hilo principal no se bloquea.

Su código se vería de la siguiente manera:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; UILabel *labelText = (UILabel *)[cell viewWithTag:1000]; labelText.text = [[self.listOfPlaceDetails objectAtIndex:indexPath.row] objectForKey:@"name"]; NSURL *imageURL = [NSURL URLWithString:[[self.listOfPlaceDetails objectAtIndex:indexPath.row]objectForKey:@"imageCell"]]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; UIImage *image = [UIImage imageWithData:imageData]; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = image; }); }); return cell; } 

Puede usar el framework SDWebImage para cargar imágenes de forma asíncrona.

Siga el enlace: https://github.com/rs/SDWebImage

Simplemente agregue el marco SDWebImage a su proyecto y configure el otro indicador del linker '-ObjC', para usar el marco.

Enlace de descarga: https://github.com/rs/SDWebImage/releases

Descargue este proyecto y use asynimageveiw en el enlace imageview de su celda ..

Use NSOperation y NSOperationQueue.Una solución perfecta para su problema. Utilice el enlace a continuación para ver cómo funciona.

http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

O

Usar la biblioteca AFNetworking También proporciona una categoría sobre UIImageview que descarga la image de forma asíncrona.