我有一个表视图,其中包含一个单元格,每个单元格都有一个UIImageView。
图像从互联网上异步加载,并在每个图像下载后显示在相关的单元格中。
我面临的问题是,在每个图片都加载之前,我无法点击一个单元格将其转换为另一个链接到它的视图。
我正在使用dispatch_async(dispatch_get_global_queue(0, 0), ^{[self getItemImagesAsync:urlArray];});
启动加载图片的异步过程。
getItemImagesAsync
方法在这里:
- (void) getItemImagesAsync:(NSArray *)urlArray{
NSMutableArray *imageArray = [[NSMutableArray alloc] init];
ResizedImageData = imageArray;
for (NSString *searchString in urlArray) {
if (!shouldContinueLoadingImages) {
return;
}
[imageArray addObject:[self getImageFromURL:searchString]];
ResizedImageData = imageArray;
[self.tableView reloadData];
}
}
当视图更改(由于搜索功能)时,shouldContinueLoadingImages
变量设置为false,以停止不必要的图像加载。
所有图像数据都保存在NSArray ResizedImageData
为了使整个表在渲染之前不必等待图像下载,代码在cellForRowAtIndexPath
方法中使用try语句来查看图像数据数组中是否存在图像:
@try {
cell.imageView.image = [ResizedImageData objectAtIndex:indexPath.row];
}
@catch (NSException *exception) {}
我在这里缺少一些基本概念,还是有些不同?
答案 0 :(得分:1)
此代码存在一些问题。您正在后台线程中重新加载数据。您正在重新加载表视图。每次重新加载数据时,都会抛出多个异常。
有一种更简单的方法:
NSAssert([urlArray count] > indexPath.row, @"There are more rows than image URLs");
NSInteger index = indexPath.row;
NSString *URLString = [urlArray objectAtIndex:index];
// Prep the cell to download the image
cell.imageView.tag = index; // cell needs to remember which image it's downloading.
cell.imageView.image = nil; // Remove the image from the previous use of cell.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Download the image in the background
UIImage *image = [self getImageFromURL:URLString];
dispatch_async(dispatch_get_main_queue(), 0), ^{
// Back on the main thread, set the image in the cell.
if (cell.imageView.tag == index) { // only if the cell is on the same index.
cell.imageView.image = image;
}
});
});