我們實現並擴展NSData,將數據異步持久化到URL。 這是一個簡短版本的功能。異步swift函數應該保留對該對象的強引用嗎?
extension NSData {
func writeToURL1(url:NSURL, completion:() -> Void) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self] in
guard let strongSelf = self else { return }
strongSelf.writeToURL(url, atomically: true)
completion()
})
}
}
下面是我們如何使用它:
var imageData = UIImageJPEGRepresentation(image, 0.8)
imageData?.writeToURL(someURL) { in ... }
當然,問題是,如果寫操作完成之前strongSelf
將是零imageData
被釋放,並完成處理程序將永遠不會被調用。
有兩個解決這一問題。
- 在完成塊刪除
[weak self]
(即在writeToURL1
的強引用self
。 - 參考
imageData
(即imageData?.writeToURL(someURL) { in imageData = nil ... }
)
什麼方法更斯威夫特友好,我們應該選擇什麼方法?
謝謝!
謝謝。你的答案是完全合理的,我們很可能會選擇選項1.我們之所以走向虛弱自我的原因是我們正在考慮在應用程序範圍內使用它,並希望下一個開發者選擇是否將其保存在內存中,而不是僅僅發送它不知道。這是關於誰可以控制記憶,調用函數或過程本身的人。 –