我有一个有照片的UITableView,我从URL获取这些照片,我使用该块异步下载这些照片,我希望这些照片按照UITableView中单元格的顺序下载?
// Download the images from the review of the businesses and put them into the "imageArray"
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
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];
photo.image = imageField;
});
});
答案 0 :(得分:0)
你需要做这样的事情:
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种状态:
使用此功能,如果在下载图像时连续向上和向下滚动,可以防止多次下载相同的图像。