我正在异步地将图像加载到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个这样的单元图像加载以触发)会引起我的担忧,即所有异步线程是否“安全着陆”他们应该在哪里。我看到的行为(在视频中)似乎证实我在这里做错了。我很感激您可能提供的任何细节或广泛的方法建议。
感谢您的帮助!
答案 0 :(得分:2)
听起来你没有正确地重复使用细胞。
确保在通过[tableView dequeueReusableCellWithIdentifier:blah]
重复使用单元格时,将单元格图像设置为nil
,直到新图像完全下载并准备好显示。
此外,在重复使用单元格时,取消对其图像的潜在运行请求,以防止前一个单元格的图像加载速度较慢,从而覆盖真实单元格。