繁体   English   中英

重新加载UICollectionView的最佳方法

[英]Best way to reload UICollectionView

我有一个UICollectionView ,可以从照片库加载照片集。

for asset: PHAsset in self.photoAssets! {
                            SFSImageManger.imageFromAsset(asset, isOriginal: false, toSize: CGSize(width: 150, height: 150), resultHandler: { (image: UIImage?) in
                                guard image != nil else { return }
                                dispatch_async(dispatch_get_main_queue(), {
                                    self.photos.append(image!)
                                    self.albumCollection.reloadData()
                                })
                            })
                        }

这就是我加载照片的方式。 问题是当我有很多照片(例如500张以上)时,滚动查看时collectionView会闪烁,并且直到for循环完成时collectionView选择才起作用。

我不希望该应用程序显示加载进度并冻结UI。 那么,在这种情况下如何提高性能?

我要做的是在您的照片数组中创建一个didSet,如下所示:

var photos = [UIImages]() {
    didSet {
        albumCollection.reloadData()
    {
}

我想您的循环在一个函数中,在这种情况下,我将创建一个临时数组,并使用photos数组对其进行初始化,将图像附加到该临时数组中,然后在循环之后将该临时数组分配回原始的photo数组。 我的想法是这样的:

var tempPhotos = photos
   for asset: PHAsset in self.photoAssets! {
                            SFSImageManger.imageFromAsset(asset, isOriginal: false, toSize: CGSize(width: 150, height: 150), resultHandler: { (image: UIImage?) in
                                guard image != nil else { return }
                                dispatch_async(dispatch_get_main_queue(), {
                                    self.tempPhotos.append(image!)
                                })
                            })
                        }
    photos = tempPhotos

这样,collectionView将仅更新一次。 问候豪尔赫·帕拉维奇尼。

cellForRow方法中的资产生成图像,而图像正在生成显示占位符,或者只是灰色背景,而不是单元格中的图像。

您不应该重新加载完整的集合视图。 而是使用带有insertItems()增量更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM