我们实现并扩展了 NSData,将数据异步保存到 URL。 这是该函数的简短版本。
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 ... }
问题当然是如果 imageData
在写操作完成之前被释放 strongSelf
将是 nil 并且永远不会调用完成处理程序。
这个问题有两种解决方案。
- 删除
[weak self]
(即在writeToURL1
中对self
进行强引用。 - 在完成 block 中引用
imageData
(即imageData?.writeToURL(someURL) { in imageData = nil ... }
)
哪种方法对 Swift 更友好,我们应该选择哪种方法?
谢谢!
最佳答案
如果您不希望对象从您的脚下消失(并且这样做不会创建引用循环),则应使用强引用;如果您不关心物体是否从您脚下离开,则为弱引用;一个无主引用,如果你需要对象在身边,并且强烈保证对象不会从你脚下消失,但强引用会创建一个循环。
在您的情况下,您关心对象是否会消失,因为这意味着您将无法保存它。由于您无法保证在该任务完成之前,其他东西会让对象保持事件状态,因此您应该使用强引用。
当你随身携带闭包时,闭包中对 self
的强引用是一个问题,因为很容易以不明显的引用循环结束,但你知道引用将是在闭包执行后立即下降,所以这不是问题。
关于ios - 异步 swift 函数是否应该保留对该对象的强引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39460502/