gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:25:16 48 4
gpt4 key购买 nike

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

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com