0

我正在将图像异步加载到 UITableView (GCD) 上,并且看到了一种奇怪的行为,即单元格将“关闭”多个图像,然后再设置一个。这很难用语言来描述,所以我做了一个屏幕录像,你会看到对于一个给定的单元格,多个图像会在它固定在一个之前移动。

http://www.youtube.com/watch?v=PKuqng81QX4

我正在使用队列(从 REST 端点)获取图像,然后使用主队列在单元格中设置图像。这是代码片段:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

// ..after getting the cell:

    dispatch_queue_t imageQ = dispatch_queue_create("imageQ", NULL);
    dispatch_async(imageQ, ^{
        NSString *galleryTinyImageUrl = someFunctionToGetThumbnailUrl;
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imageView.image = [UIImage imageWithData:imageData];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        });
    });
    dispatch_release(imageQ);

这在短时间内被多次调用(即用户在桌子上轻弹,触发这些单元图像加载中的 30 个触发)的事实引起了我的担忧,是否所有异步线程都“安全地”“着陆”到它们的位置重新应该。我看到的行为(在视频中)似乎证实了我在这里做错了什么。我将不胜感激您可能提出的任何具体或广泛的方法建议。

谢谢您的帮助!

4

1 回答 1

2

听起来您没有正确实现单元格的重用。确保在重新使用单元格时,通过[tableView dequeueReusableCellWithIdentifier:blah]将单元格图像设置为,nil直到新图像已完全下载并准备好显示。

此外,在重用单元格时,请取消对其图像的潜在运行请求,以防止先前单元格的图像加载速度较慢,从而覆盖真实的图像。

于 2012-04-15T18:50:36.560 回答