【发布时间】:2014-12-31 12:27:05
【问题描述】:
我有一个 UICollectionView 显示自定义单元格的网格。当我在cellForItemAtIndexPath 中设置单元格时,我会调用单元格子类上的一个方法来设置 UI(例如[cell setupUI])。此方法会加载一些标签,但也会调用从 Web 获取图像的异步方法。我正在使用 AFNetworking 来处理这个问题。
我的问题是,有时(经常)图像会加载到正确的单元格 + 不应该设置图像的单元格中。数据似乎只是随机加载到单元格中。
我已经研究了一段时间并尝试了多种方法,但我无法弄清楚我哪里出错了。有没有我遗漏的问题?
注意:我已经检查过,设置这些图像单元格的方法被称为正确的次数 (3),但图像出现在 5 个单元格上。
编辑
这是用于获取图像的代码。我以前在没有 CollectionView 的情况下使用过它(自己绘制网格)并且效果很好:
[self.youtubeThumbnail setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){
weakImageView.image = image;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
}];
weakImageView 是对我的单元格图像视图的弱引用。以上代码在cell子类中,从cellForItemAtIndexPath中调用。
我应该指出这个方法在 dispatch_async(dispatch_get_global_queue) 上运行,图像加载在 dispatch_async(dispatch_get_main_queue) 上。
解决方案
所以我的问题其实很奇怪。我的集合视图被多次重新加载,这导致数据多次出现在不正确的单元格中。我仍然不能 100% 确定为什么会这样,但我已经设法通过检查内容是否已重新加载、设置 BOOL 并防止再次重新加载来解决它。 我选择的答案是正确的,这有助于我获得正确的异步加载,这也可能是问题的一部分。 感谢您的帮助。
【问题讨论】:
-
您可以将代码发布到您要获取图像的位置吗?它可能就像 reloadData 在错误的位置或获取问题一样简单。另外,为了排查和排除错误假设,请尝试在应用启动时下载图像数组,以便将其存储在本地。
-
@carlodurso 我添加了获取图像的代码和更多解释。
-
我应该指出这个方法是在 dispatch_async(dispatch_get_global_queue) 上运行的并且图像加载是在 dispatch_async(dispatch_get_main_queue) 上。
标签: ios objective-c uicollectionview