美文网首页
关于 UIImageWriteToSavedPhotosAlbu

关于 UIImageWriteToSavedPhotosAlbu

作者: 蛮荒星域 | 来源:发表于2020-08-31 10:25 被阅读0次

    前言

    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<ImageWritingContext> = 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()

    相关文章

      网友评论

          本文标题:关于 UIImageWriteToSavedPhotosAlbu

          本文链接:https://www.haomeiwen.com/subject/svycsktx.html