我正在异步加载图像到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断火),这一事实令人关切的对我来说是否所有的异步线程“安全地”安全到达应有的位置。我所看到的行为(在视频中)似乎证实我在这里做错了事。我很感激你可能有的任何细节或广泛的方法建议。
感谢您的帮助!
谢谢!我添加了'cell.imageView.image = nil;'在获取一个新的/重用的单元格下面并修复了它! – Steven 2012-04-15 19:06:11
很高兴我能帮助你。 – 2012-04-15 19:42:32
如何避免在循环中下载图像? – mikezang 2012-04-20 12:42:54