0

我有一个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时会闪烁,并且collectionView选择在for循环完成之前不起作用。

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

回答

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。

0

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