Вам нужно сделать что-то вроде этого:
1) Сначала создайте и изменяемый массив, полный NSNull.
2) В CellForRowAtIndexPath спросите, равен ли массив в этом indexPath.row значению NSNull.
2.1) Если равно, загрузите изображение так:
dispatch_queue_t bgqueue = dispatch_queue_create("com.yourApp.yyourclass.bgqueue", NULL);
dispatch_async(bgqueue, ^{
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://feature.site.com%@",entry.avatarUrl]]];
UIImage *imageField = [[UIImage alloc] initWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
[imageArray addObject:imageField atIndex:indexPath.row];
tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]
});
});
dispatch_release(bgqueue);
2.2) Если не равно (есть изображение), просто установите изображение в массиве.
photo.image = [imageArray objectAtIndex:indexPath.row];
При этом ваши изображения сохраняют порядок ячеек, и вы увеличиваете производительность прокрутки.
PD-1: Вы должны использовать библиотеку, которая обрабатывает загрузку и кэширование изображений, например HTTPRequest
PD-2: В своем сообщении «Сделайте reReceiveMemoryWarning» вы должны сделать что-то вроде этого:
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
[imagesArray removeAllObjects];
//Fill the array with NSNull's again;
}
Дальнейшее улучшение:
В массиве вы можете иметь 3 состояния:
- NSNull: Нет изображения
- NewState (например, некоторая строка): загружаемое изображение.
- UIImage: загруженное изображение.
При этом вы можете запретить загрузку одного и того же изображения несколько раз, если во время загрузки изображений непрерывно прокручивать вверх и вниз.