我有一个UICollectionView,我在其中加载了相册中的所有用户照片。当用户打开控制器时,所有照片都被提取并存储在一个数组中。点击照片将创建一个黑色背景和该照片的更大版本的子视图。再次点击它将通过缩小过渡将其从superView中删除。
我的问题是我不知道如何保持照片的原始大小以及保持较低的执行时间。将100多张照片加载到一个集合中真的会伤害我的加载时间。
我认为没有必要在更高的CGSize上获取图片,因为我实际上希望它是单元格的边界(我每行有三个单元格)。
以250 x 250获取图像会返回0.20秒的执行时间
以300×300的比例获取图像会返回3.0秒的执行时间
我想要实现的是保持非常低的执行时间,在拍摄时具有清晰的缩略图和该照片的高分辨率版本。我是否必须创建第二个线程以在后台加载所有内容,或者最好不在我的viewDidLoad中调用我的函数?
var imageArray = [UIImage]()
func getPhotosFromAlbum() {
let imageManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
self.imageArray.append(image!)
})
}
} else {
self.collectionView?.reloadData()
}
}
答案 0 :(得分:2)
通常,如果您正在进行一些繁重的处理,最好在后台线程中执行此操作,这样您就不会锁定主线程或使UI交互缓慢。当然,在这种情况下,请记住在主线程上进行任何UI更新。