UITableView异步图像通过多个图像加载快门

时间:2012-04-15 18:44:17

标签: ios uitableview uiimageview grand-central-dispatch

我正在异步地将图像加载到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个这样的单元图像加载以触发)会引起我的担忧,即所有异步线程是否“安全着陆”他们应该在哪里。我看到的行为(在视频中)似乎证实我在这里做错了。我很感激您可能提供的任何细节或广泛的方法建议。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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