前言
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()
网友评论