前言
UIImageWriteToSavedPhotosAlbum 是保存到相冊(cè)的方法。
// 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?)
調(diào)用該方法時(shí)是執(zhí)行寫入操作,但是成功與否并不能直接知道,需要定義一個(gè) selector 去讀取回調(diào)的數(shù)據(jù)。
比如:
// - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
但是這個(gè) selector 只能接受默認(rèn)的幾個(gè)參數(shù),image,error,contextInfo,通過(guò)這個(gè) error 可以知道是否保存成功,但是如果想在這個(gè) selector 中做更多的文章是有點(diǎn)麻煩的。
分析
我們看到 UIImageWriteSavedPhotosAlbum 這個(gè)方法有幾個(gè)參數(shù),image,completionTarget,completionSelector, contextInfo
image 即為需要保存的圖片。
completionTarget,為 selector 調(diào)用的對(duì)象
completionSelector 是接收改寫入操作的一些信息。
contextInfo 與 completionSelector 中的 contextInfo 是同一個(gè)對(duì)象,這里我們可以想點(diǎn)辦法。
既然兩個(gè)一致,那么我們可以傳入一些信息。
開始
注意到 completionSelector 中的 contextInfo 為 (void*),而另外一個(gè)為 UnsafeMutableRawPointer?,我們要統(tǒng)一一下。
先放出實(shí)現(xiàn):
ImageWritingContext
這個(gè)是即將傳入 selector 中的參數(shù),用來(lái)處理其他的事情
class ImageWritingContext {
var value: Int
init(_ value: Int) {
self.value = value
}
}
保存圖片,并寫入?yún)?shù)
let context = ImageWritingContext(callback)
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.didFinishSavingImage(image:error:contextInfo:)), Unmanaged.passRetained(context).toOpaque())
處理參數(shù)
@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)")
}
注意事項(xiàng)
調(diào)用 UIImageWriteToSavedPhotosAlbum 的類需要繼承自 NSObject,并且要在初始化方法中實(shí)現(xiàn) super.init()