• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

IOS 来源:Sei Flavius 3次浏览

我们实现并扩展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被释放,并完成处理程序将永远不会被调用。

有两个解决这一问题。

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

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

谢谢!

===========解决方案如下:

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

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

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)