Swift - 从CollectionView中的相册中获取照片并保持分辨率

时间:2017-03-29 00:43:52

标签: swift uicollectionview

我有一个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()
    }
}

1 个答案:

答案 0 :(得分:2)

通常,如果您正在进行一些繁重的处理,最好在后台线程中执行此操作,这样您就不会锁定主线程或使UI交互缓慢。当然,在这种情况下,请记住在主线程上进行任何UI更新。