iOS PHImageManager.default()。requestImage回调针对同一张图片被调用了两次

时间:2019-10-02 09:11:21

标签: ios swift photokit

当我尝试获取特定大小的图像时,会使用不同大小的图像两次调用PHImageManager.default()。requestImage。

代码如下:

static func load(from asset: PHAsset, targetSize: CGSize? = nil, completion: @escaping (UIImage?)->()) {
        let options = PHImageRequestOptions()
        options.isSynchronous = false
        let id = UUID()
        PHImageManager.default().requestImage(for: asset, targetSize: targetSize ?? PHImageManagerMaximumSize, contentMode: .aspectFill,
                options: options, resultHandler: { image, _ in
            print(id)
            runInMain {
                completion(image)
            }
        })
    }

我添加了UUID,以检查同一UUID是否打印两次。

2 个答案:

答案 0 :(得分:3)

这是因为在加载完整尺寸的图像时,第一个回调返回缩略图。

official Apple documentation:

  

对于异步请求,Photos可能多次调用您的结果处理程序块。照片首先调用该块,以提供适合临时显示的低质量图像,同时准备高质量图像。 (如果立即可获得低质量的图像数据,则可能在方法返回之前进行第一次调用。)当高质量的图像准备就绪时,Photos会再次调用结果处理程序以提供该图像。如果图像管理器已经完全高质量地缓存了请求的图像,则Photos只会调用一次结果处理程序。结果处理程序的info参数中的PHImageResultIsDegradedKey键指示“照片”何时提供临时的低质量图像。

答案 1 :(得分:1)

Swift 5 高质量图像只调用一次

 let manager = PHImageManager.default()
 var imageRequestOptions: PHImageRequestOptions {
        let options = PHImageRequestOptions()
        options.version = .current
        options.resizeMode = .exact
        options.deliveryMode = .highQualityFormat
        options.isNetworkAccessAllowed = true
        options.isSynchronous = true
        return options
    }

  self.manager.requestImage(for: asset,targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: self.imageRequestOptions) { (thumbnail, info) in
         if let img = thumbnail {
             print(img)
          }
    }