异步swift函数应该保留对该对象的强引用吗?

我们实现并扩展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 spanSelf = self else { return }

spanSelf.writeToURL(url, atomically: true)

completion()

})

}

}

下面是我们如何使用它:

var imageData = UIImageJPEGRepresentation(image, 0.8) 

imageData?.writeToURL(someURL) { in ... }

当然,问题是,如果写操作完成之前spanSelf将是零imageData被释放,并完成处理程序将永远不会被调用。

有两个解决这一问题。

  1. 在完成块删除[weak self](即在writeToURL1的强引用self
  2. 参考imageData(即imageData?.writeToURL(someURL) { in imageData = nil ... }

什么方法更斯威夫特友好,我们应该选择什么方法?

谢谢!

回答:

您应该如果您不希望物体从脚下离开(并且这样做不会创建参考周期),请使用强参考。如果你不在意物体是否从脚下离开,那么它就是一个弱点;如果你需要物体在周围,并且有强有力的保证,物体不会从你的脚下消失,但是一个强有力的参考会产生一个循环。

在你的情况,你所关心的对象可能会消失,因为这意味着你将无法保存。由于您不能保证其他东西会保持对象的活动状态,直到完成任务,您应该使用强引用。

对闭包中的self的强引用是一个问题,因为它很容易以非显而易见的引用循环结束,但是您知道引用将在闭包之后立即丢弃执行,所以这不是一个问题。

回答:

这听起来像你只是想极力捕捉参考NSData对象,所以去除[weak self]在我看来是最简单,最好的办法。通常,使用弱引用来避免在闭包中捕获时的保留周期。但是,您实际上并未创建保留周期,只是通过在块中捕获自己来保留一种方法。该块不是由自我保留的,它只是将调用堆栈传递到dispatch_async中,最终在该块中调用和释放该块。因此,通过使用weak self不存在保留周期,您只需通过闭合发生保留就可以了。也就是说,您希望将数据保存在内存中直到调用闭包。

以上是 异步swift函数应该保留对该对象的强引用吗? 的全部内容, 来源链接: utcz.com/qa/259087.html

回到顶部