繁体   English   中英

在异步网络请求中捕获自身弱或无主

[英]Capturing self weak or unowned on asynchronous network requests

每当我做异步网络请求时,可能是在请求到达时self已经是nil(例如,ViewController已被解除)。

为了防止这种情况,我通常将自我视为弱者:

    future.onSuccess(context: Queue.main.context, callback: { [weak self] result in
        if let strongSelf = self {
            // Do some stuff with self, which is now guaranteed to be not nil
            // strongSelf.someMethod()
        }
    })

或者我可以将自己视为无主:

    future.onSuccess(context: Queue.main.context, callback: { [unowned self] result in
            // Do some stuff with self
            // self.someMethod()
    })

我不关心请求返回,因为当请求在ViewController已被解除的时间点返回时,我没有从请求中显示任何内容。 所以我不想让关闭时自我“活着”。

我现在的问题是 - 在这种情况下是否足以将自己视为无主? 或者我必须一直做[零自我]的零检查? 如果在请求到达并且self已经为零时无主捕获的情况下会发生什么 - 闭包是否仍然存在且将执行并且将在访问nil时触发运行时错误? 或者封闭也会与自己一起解除分配,请求会遇到“空白”?

或者在这种情况下我可以忘记弱者和无人物,因为当自我取消分配时,闭包也将被解除分配,因此在请求到达时没有访问nil的危险吗?

PS:我知道关于这个话题已经有很多问题 - 答案但是在我不关心异步到达的情况下我找不到答案。

如果您在没有weak关键字或unowned关键字的情况下捕获self,则视图控制器将由闭包保留,并且在闭包死亡之前不会释放。 之间的区别weakunowned是, weak是可选的,并要求有条件的结合作为安全检查。 另一方面, unowned并非故障安全。 它假定您的视图控制器仍处于活动状态,如果不存在则会崩溃。 有关更多信息,请参阅此答案

在这种情况下,您不希望使用unowned ,因为如果在调用完成之前取消分配对象,则您有一个未设置为nil的悬空引用。 如果您在请求完成时尝试使用此引用,则应用程序将崩溃。

另外,如果您确实不再需要响应,则还应在取消分配视图控制器时取消该请求。 如果使用NSURLSession ,则始终会获得可以取消的NSURLSessionTask引用。 所以,一个常常结合使用的[weak self]模式与代码封闭,节省了额外的弱参考NSURSessionTask并有deinit有条件地取消。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM