我有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选择不起作用。
我不希望该应用显示加载进度并冻结用户界面。那么,在这种情况下如何提高性能呢?
答案 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()
的增量更新。