UICollectionViewCell 不更新图像(如果可见)
Posted
技术标签:
【中文标题】UICollectionViewCell 不更新图像(如果可见)【英文标题】:UICollectionViewCell not updating image if visible 【发布时间】:2017-04-24 08:06:42 【问题描述】:我有一个 CollectionView,它在加载后显示缩略图。一开始,图片并没有存储在设备上,因此它们是从服务器获取的。在从服务器获取这些图像后的回调方法中,它们的单元格没有得到更新,我需要将它们滚动到屏幕之外,然后它们会得到更新。我在另一个应用程序中有类似的机制,一切正常,我找不到区别。下面是代码的一些部分,以便更好地理解我的工作。
这是我在检查缩略图是否已从服务器获取后设置图像的代码。如果是,直接设置,如果不是,使用Alamofire检索图片,加载完成后更新。
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifier, for: indexPath) as! PictureCollectionViewCell
/* Set thumbnail to the cell */
if let thumbnail = pictures[indexPath.row].thumbnail
cell.imageView.image = thumbnail
else
pictures[indexPath.row].retrievePicture(thumbnail: true, completion: picture in
cell.imageView.image = picture
)
return cell
如前所述,在我将单元格滚动出可见屏幕区域之前,它不会更新。 cell 或 collectionView 重新加载并没有解决问题。有什么想法吗?
提前致谢。
【问题讨论】:
是否调用了闭包retrievePicture()
?那是什么代码?
当您的图像下载完成时,单元格显示已完成。您需要在集合视图上调用 reloadData()
来刷新 UI。
下载完成运行在哪个线程上?
retrievePicture()
只是一个 Alamofire 网络请求,加载图像并将其传递给回调方法
collectionView 之外的屏幕上的其他一些组件通过回调方法更新
【参考方案1】:
因为块在后台线程中执行。您必须在主线程中更新 UI。使用下面的代码
pictures[indexPath.row].retrievePicture(thumbnail: true, completion: picture in
DispatchQueue.main.async
cell.imageView.image = picture
)
【讨论】:
它没有改变行为【参考方案2】:您可能会发现简单地重新加载 indexPath 中的项目而不是使用以下方法重新加载整个表会更好:
collectionView.reloadItemsAtIndexPaths(yourIndexPath)
【讨论】:
【参考方案3】:获取可能发生在后台线程中,因此您的回调函数也会从中调用。 UI 无法从后台线程更新。 所以在你的获取回调中尝试使用这样的东西:
DispatchQueue.main.async
collectionView.reloadData()
或者
DispatchQueue.main.async
collectionView.reloadItems(indexPaths)
【讨论】:
行为和以前一样,没有改变任何东西【参考方案4】:好吧,伙计们,这是你能想象到的最愚蠢的错误。从异步回调方法更新 UI 效果很好。我只是忘了从异步任务中调用回调方法。问题已解决,感谢您的帮助。
【讨论】:
以上是关于UICollectionViewCell 不更新图像(如果可见)的主要内容,如果未能解决你的问题,请参考以下文章
NSOperationQueue mainQueue 不更新 UICollectionViewCell
iOS 8.4 不更新 uicollectionviewcell 上的约束
在 UICollectionViewCell 中更新 UITableView