2012-04-15 115 views
0

我正在异步加载图像到UITableView(GCD)上,并且看到一种奇怪的行为,其中单元格将在多个图像上“快门”,然后再建立一个图像。这很难用言语来形容,所以我做了一个屏幕录制,在这里你会看到对于一个给定的单元格,多个图像在它们定位之前会转移。UITableView异步图像通过多个图像加载百叶窗

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断火),这一事实令人关切的对我来说是否所有的异步线程“安全地”安全到达应有的位置。我所看到的行为(在视频中)似乎证实我在这里做错了事。我很感激你可能有的任何细节或广泛的方法建议。

感谢您的帮助!

回答

2

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

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

+0

谢谢!我添加了'cell.imageView.image = nil;'在获取一个新的/重用的单元格下面并修复了它! – Steven 2012-04-15 19:06:11

+0

很高兴我能帮助你。 – 2012-04-15 19:42:32

+0

如何避免在循环中下载图像? – mikezang 2012-04-20 12:42:54