【问题标题】:What happens to a promise that's abandoned?一个被放弃的承诺会发生什么?
【发布时间】:2017-08-26 20:10:56
【问题描述】:
我在视图控制器中定义了以下代码。
_ = accountService.getAccount()
.then { user -> Void in
self.txtBxUser.text = user.username
self.txtBxEmail.text = user.email
}
getAccount 发出 REST API 请求。
如果用户在调用返回之前关闭视图控制器,那么回调链会发生什么情况?假设它仍然被引用,它仍然运行吗?
【问题讨论】:
标签:
ios
swift
asynchronous
promisekit
【解决方案1】:
如果用户在调用返回之前关闭视图控制器,那么回调链会发生什么情况?假设它仍然被引用,它仍然运行吗?
是的,它仍在运行。
请注意,闭包中对self 的引用意味着它还保持对视图控制器的引用,直到then 闭包完成运行。因此,如果视图控制器有可能被解除,您可能需要使用 weak 引用:
_ = accountService.getAccount().then { [weak self] user -> Void in
self?.txtBxUser.text = user.username
self?.txtBxEmail.text = user.email
}
理想情况下,您还应该使getAccount 可取消并在视图控制器的deinit 中取消它。
(注意,在FAQ - Should I be Concerned About Retain Cycles 中,PromiseKit 文档指出您不需要 weak 引用,这是正确的。这只是您是否介意解除分配的视图控制器的问题推迟到承诺完成后。)
【解决方案2】:
我应该关注保留周期吗? tl; dr:使用安全
承诺处理程序中的自我。
这是安全的:
somePromise.then {
self.doSomething()
}
如果 somePromise 解析,传递给 then 的函数将是
已发布,因此无需指定 [weak self]。
指定[unowned self] 可能很危险。
你是在告诉我不要担心保留周期?!不,这只是
默认情况下,您在使用时不会导致保留周期
承诺套件。但是还是可以的,比如:
self.handler = {
self.doSomething
self.doSomethingElse }
somePromise.then(execute: self.handler)
我们分配给的闭包
handler 强烈保留 self。 handler 被self 强烈保留。
这是一个典型的保留周期。不要编写典型的保留周期!
值得注意的是,这不是一个保留周期:
somePromise.then(execute: self.doSomething).then(execute: self.doSomethingElse)
source