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

子类 UICollectionViewCell 不更新图像

iOS 8.4 不更新 uicollectionviewcell 上的约束

在 UICollectionViewCell 中更新 UITableView

使用 UICollectionViewCell 内的 Textfield 更新标签

UICollectionViewCell 中的标签文本未更新