Swift - 从收藏视图中的相册中获取照片并保持分辨率



我有一个UICollectionView,我在其中从相册中加载所有用户的照片。当用户打开控制器时,所有照片都会被提取并存储在数组中。点击照片将创建一个具有黑色背景的子视图和该照片的更大版本。再次点击它将通过缩小过渡将其从超级视图中删除。

我的问题是我不知道如何保持照片的原始大小以及保持较低的执行时间。将100 +照片加载到收藏集中确实会损害我的加载时间。

我认为没有必要以更高的CGSize获取图片,因为我实际上希望它是单元格的边界(我每行有三个单元格)。

以 250 x 250 获取图像将返回 0.20 秒的执行时间

以 300 x 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()
}
}

通常,如果要进行一些繁重的处理,最好在后台线程中进行,以免锁定主线程或使UI交互缓慢。当然,在这种情况下,请记住在主线程上进行任何 UI 更新。