前言
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?)
調(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
低匙,通過這個(gè) error
可以知道是否保存成功旷痕,但是如果想在這個(gè) selector
中做更多的文章是有點(diǎn)麻煩的。
分析
我們看到 UIImageWriteSavedPhotosAlbum
這個(gè)方法有幾個(gè)參數(shù)顽冶,image
,completionTarget
,completionSelector
, contextInfo
image
即為需要保存的圖片测砂。
completionTarget
安疗,為 selector
調(diào)用的對象
completionSelector
是接收改寫入操作的一些信息。
contextInfo
與 completionSelector
中的 contextInfo
是同一個(gè)對象,這里我們可以想點(diǎn)辦法宫蛆。
既然兩個(gè)一致脏嚷,那么我們可以傳入一些信息各淀。
開始
注意到 completionSelector
中的 contextInfo
為 (void*)妇穴,而另外一個(gè)為 UnsafeMutableRawPointer?
,我們要統(tǒng)一一下拱燃。
先放出實(shí)現(xiàn):
ImageWritingContext
這個(gè)是即將傳入 selector
中的參數(shù)秉溉,用來處理其他的事情
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()