无法点击要切换的单元格,直到所有图像都加载为止

时间:2014-04-09 23:17:16

标签: ios objective-c uitableview uiimageview

我有一个表视图,其中包含一个单元格,每个单元格都有一个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) {}

我在这里缺少一些基本概念,还是有些不同?

1 个答案:

答案 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;
        }
    });
});