iOS PHImageManager.default().requestImage 回调为同一图像调用两次

Sem*_*nko 4 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)
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

我添加了 UUID 来检查相同的 UUID 是否打印了两次。

alx*_*ves 12

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

来自苹果官方文档:

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


Gur*_*ngh 10

Swift 5它仅使用.deliveryMode = .highQualityFormat调用一次

 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)
          }
    }
Run Code Online (Sandbox Code Playgroud)

  • Swift 5 意味着下面的代码片段来自 swift 5 版本。@ericosg (2认同)