关于 UIImageWriteToSavedPhotosAlbu
2020-08-31 本文已影响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 是接收改写入操作的一些信息。
contextInfo 与 completionSelector 中的 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()