AFNetworking UIImageView necesita desplazarse para cargar las imágenes

Estoy insertando imágenes en UITableViewCell con AFNetworking. El problema es que necesito desplazarme por la tabla para ver las imágenes.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; Recipe *recipe = [self.fetchedResultsController objectAtIndexPath:indexPath]; cell.textLabel.text = recipe.value; NSURL *url = [NSURL URLWithString:[BaseURLString stringByAppendingString:recipe.img]]; [cell.imageView setImageWithURL:url]; return cell; } 

Existe un método ya implementado por AFNetworking en la categoría UIImageView + AFNetworking.

 [imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { blockImageView.image = image; } failure:nil]; 

Tenga en count que si pasa en cero con éxito, la image se establece en la vista de image a la que llama el método. En mi caso imageView.

Entonces, aquí supongo que puede volver a cargar datos si lo necesita.

Además de la respuesta de Peter Segerblom , recomendaría usar una reference __weak en lugar de la variable __block __block Image Variable para evitar un ciclo de retención.

Si simplemente utiliza __block , la copy de imageView nunca se desasignará y el conteo siempre permanecerá incluso después de que se haya ido la tablaView porque el puntero hace reference a otra dirección de memory.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; cell.textLabel.text = @"Cell text"; NSURLRequest *request = [NSURLRequest requestWithURL:imageURL]; __weak UITableView *weakTableView = tableView; __weak UITableViewCell *weakCell = cell; __weak UIImageView *weakImageView = cell.imageView; [cell.imageView setImageWithURLRequest:request placeholderImage:placeholderImage success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { weakImageView.image = image; if ([weakTableView.visibleCells containsObject:weakCell]) { [weakTableView reloadRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationNone]; } } failure:nil]; return cell; } 

@pxpgraphics: tuve que replace

 NSURLRequest *request = [NSURLRequest requestWithURL:imageURL]; 

con

 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]]; 

para evitar un error de time de ejecución.

Swift equivalente:

 let request = NSURLRequest(URL: book.mediumImageURL) cell.imageView.setImageWithURLRequest(request, placeholderImage: nil, success: { [weak cell] request, response, image in if cell { cell!.imageView.image = image } if tableView.visibleCells().bridgeToObjectiveC().containsObject(cell) { tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None) } }, failure:nil) 

Esta publicación tiene una respuesta que funciona: http://jabbleashish.blogspot.com/2013/12/setting-fitableviewcell-imageview-via.html

 NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"YOUR_URL"]]; [cell.imageView setImageWithURLRequest:imageRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ NSLog(@"success"); cell.imageView.image = image; cell.imageView.contentMode = UIViewContentModeScaleAspectFit; cell.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [cell setNeedsLayout];// To update the cell {if not using this, your image is not showing over cell.} }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ NSLog(@"Failure");} 

Esto parece sencillo sin tener que volver a cargar la celda según la ruta del índice.

Creo que este es el mejor código para usar:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"SimpleTableItem"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; } NSURL *url = [NSURL URLWithString:@"http://www.myimageurl.com"]; //Change this URL]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; __weak UITableViewCell *weakCell = cell; __weak UIImageView *weakImageView = cell.imageView; [cell.imageView setImageWithURLRequest:request placeholderImage:[UIImage imageNamed:@"granaziOrange"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { weakImageView.image = image; [weakCell setNeedsLayout]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { NSLog(@"Failed to get image"); }]; return cell; } 

Depende del tipo de celda: si tiene una celda personalizada con su propia UIImageView dentro, ¡asegúrese de NO llamar a su salida "imageView"! Porque ya hay imageView interno dentro de cada celda. Solucioné el problema cambiando el nombre de IBOutlet vinculado con algo como * myImageView y ahora todo funciona bien con el código:

 [cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://placehold.it/100x100"]];