swift - 在异步网络请求中捕获 self weak 或 unowned

标签 swift asynchronous closures

每当我执行异步网络请求时,可能是在请求到达时 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()
        }
    })

或者我可以将 self 捕捉为无主:

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

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

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

或者在这种情况下我可以同时忘记 weak 和 unowned 因为当 self get 被释放时闭包也将被释放,所以在请求到达时不存在访问 nil 的危险?

PS:我知道关于这个主题已经有很多问答,但如果我不关心异步到达,我找不到答案。

最佳答案

如果您在没有 weakunowned 关键字的情况下捕获 self,您的 View Controller 将被闭包保留,并且不会在闭包结束前释放。 weakunowned 之间的区别是 weak 是一个 Optional 并且需要条件绑定(bind)作为安全检查。另一方面,unowned 并不是万无一失的。它假定您的 View Controller 仍然存在,如果它不存在,它将崩溃。有关详细信息,请参阅 this answer .

关于swift - 在异步网络请求中捕获 self weak 或 unowned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372770/

相关文章:

javascript - 在子函数中使用带有闭包的 concat 方法

javascript - 无法访问模块函数中的 quill 实例

swift - 创建一个 CountableClosedRange<Character>

javascript - node.js 应用程序 - 如何通过包含连接到 mongodb 和 "share"连接?

ios - IBAction 事件含义

javascript - 如果不是 promise ,如何等待值返回

C# 使用已启动的列表<>取消任务

javascript - 在 for 循环中分配点击处理程序

ios - NSKeyedArchiver 返回 nil Swift 4.2

ios - 如何知道 XCTestExpectation 当前履行计数