關(guān)于 UIImageWriteToSavedPhotosAlbum 回調(diào)方法攜帶自定義參數(shù)

前言

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 是接收改寫入操作的一些信息。
contextInfocompletionSelector 中的 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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容