我正在将图像异步加载到 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 个触发)的事实引起了我的担忧,是否所有异步线程都“安全地”“着陆”到它们的位置重新应该。我看到的行为(在视频中)似乎证实了我在这里做错了什么。我将不胜感激您可能提出的任何具体或广泛的方法建议。
谢谢您的帮助!