关于 UIImageWriteToSavedPhotosAlbum 回调方法携带自定义参数

前言

UIImageWriteToSavedPhotosAlbum 是保存到相册的方法。

// Adds a photo to the saved photos album.  The optional completionSelector should have the form:
//  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
public func UIImageWriteToSavedPhotosAlbum(_ image: UIImage, _ completionTarget: Any?, _ completionSelector: Selector?, _ contextInfo: UnsafeMutableRawPointer?)

调用该方法时是执行写入操作,但是成功与否并不能直接知道,需要定义一个 selector 去读取回调的数据。
比如:

//  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

但是这个 selector 只能接受默认的几个参数,image,error,contextInfo,通过这个 error 可以知道是否保存成功,但是如果想在这个 selector 中做更多的文章是有点麻烦的。

分析

我们看到 UIImageWriteSavedPhotosAlbum 这个方法有几个参数,image,completionTarget,completionSelector, contextInfo

image 即为需要保存的图片。
completionTarget,为 selector 调用的对象
completionSelector 是接收改写入操作的一些信息。
contextInfocompletionSelector 中的 contextInfo 是同一个对象,这里我们可以想点办法。

既然两个一致,那么我们可以传入一些信息。

开始

注意到 completionSelector 中的 contextInfo 为 (void*),而另外一个为 UnsafeMutableRawPointer?,我们要统一一下。

先放出实现:

ImageWritingContext

这个是即将传入 selector 中的参数,用来处理其他的事情

class ImageWritingContext {
  var value: Int

  init(_ value: Int) {
    self.value = value
  }
}

保存图片,并写入参数

let context = ImageWritingContext(callback)
          UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.didFinishSavingImage(image:error:contextInfo:)), Unmanaged.passRetained(context).toOpaque())

处理参数

@objc func didFinishSavingImage(image: UIImage, error: NSError?, contextInfo: UnsafeRawPointer?) {
    guard let unmanagedImageWriting: Unmanaged = contextInfo.map(Unmanaged.fromOpaque) else {
      return
    }
    let imageWriting = unmanagedImageWriting.takeRetainedValue()
    let value = imageWriting.value

    guard let error = error else {
      print("Save imag succeed. value: \(value).")
      return
    }

    print("Save image failed with error \(error)")
  }

注意事项

调用 UIImageWriteToSavedPhotosAlbum 的类需要继承自 NSObject,并且要在初始化方法中实现 super.init()

你可能感兴趣的:(关于 UIImageWriteToSavedPhotosAlbum 回调方法携带自定义参数)