【问题标题】:iOS PHImageManager.default().requestImage callback is called twice for the same imageiOS PHImageManager.default().requestImage 回调为同一张图片调用了两次
【发布时间】:2019-10-02 09:11:21
【问题描述】:

当我尝试获取特定尺寸的图像时,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。

【问题讨论】:

    标签: ios swift photokit


    【解决方案1】:

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

    来自official Apple documentation:

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

    【讨论】:

      【解决方案2】:

      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)
                }
          }
      

      【讨论】:

      • 不正确。上面代码 sn -p 触发一次回调的原因是使用了.deliveryMode = .highQualityFormat,而不是使用了 Swift 5。
      • Swift 5 表示下面的代码 sn-p 来自 swift 5 版本。 @ericosg
      【解决方案3】:

      使用: requestOptions.deliveryMode = .highQualityFormat

      而不是:requestOptions.deliveryMode = .opportunistic

      .opportunistic - 照片自动提供一个或多个结果,以平衡图像质量和响应速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 1970-01-01
        • 2022-10-18
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多