从图库中缓慢获取图像

时间:2019-05-24 17:51:41

标签: ios swift image photosframework

当我尝试从图库中获取10张图像时,要花很长时间才能找到它。

  1. 为什么图像获取异步?
  2. 如果我将requestOptions.deliveryMode更改为.fastFormat,它会变快,但质量却不能令人满意

我能做的最好的事是什么?

func fetchPhotos() {
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchOptions.fetchLimit = 10

    let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)

    if fetchResult.count > 0 {
        let totalImageCountNeeded = 10 // <-- The number of images to fetch
        fetchPhotoAtIndex(0, totalImageCountNeeded, fetchResult)
    }
}

func fetchPhotoAtIndex(_ index:Int, _ totalImageCountNeeded: Int, _ fetchResult: PHFetchResult<PHAsset>) {

    let requestOptions = PHImageRequestOptions()
    requestOptions.deliveryMode = .highQualityFormat

    PHImageManager.default().requestImage(for: fetchResult.object(at: index) as PHAsset, targetSize: view.frame.size, contentMode: PHImageContentMode.aspectFill, options: requestOptions, resultHandler: { (image, _) in
        if let image = image {
            // Add the returned image to your array
            self.images += [image]
        }

        if index + 1 < fetchResult.count && self.images.count < totalImageCountNeeded {
            self.fetchPhotoAtIndex(index + 1, totalImageCountNeeded, fetchResult)
        } else {
            print("Completed array: \(self.images)")
            self.collectionView.reloadData()
        }
    })
}

2 个答案:

答案 0 :(得分:1)

我刚刚测试了您的代码,加载了50张图像大约花费了一秒钟的时间,请检查您的代码中是否还有其他东西可能会减慢此过程。 如果您打算在显示View Controller时立即加载所有图像,请考虑在前一个屏幕上加载图像。

答案 1 :(得分:0)

  1. 该请求是异步的,因为它需要使用网络。异步只是意味着在应用程序线程的同步执行之外需要花费一些时间来执行。同步将与运行代码的应用程序线程同步执行代码。在这里,线程必须等待网络请求完成。

  2. 您将在质量和速度之间进行权衡。显然,图像质量越好,图像越大,因此下载时间越长。

我建议您下载较小的照片块,或者重新考虑UI,以便一次显示较少的图像。您可以显示10张图像,而不是显示10张图像,而用分页功能预加载下3张图像。