重新加载UICollectionView的最佳方法

时间:2016-11-08 14:16:01

标签: ios swift uicollectionview grand-central-dispatch reloaddata

我有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选择不起作用。

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

3 个答案:

答案 0 :(得分:1)

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

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

我认为你的循环是一个函数,在这种情况下我会创建一个临时数组并用photos数组初始化它,将图像附加到临时数组,并在循环后将临时数组分配回原始数组照片数组。这样的事情是我的想法:

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只会更新一次。 问候Jorge Paravicini。

答案 1 :(得分:0)

cellForRow方法中从资源生成图像的方法是什么?图像生成显示占位符或仅生成灰色背景而不是单元格中的图像。

答案 2 :(得分:0)

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