我在视图控制器中定义了以下代码。
_ = accountService.getAccount()
.then { user -> Void in
self.txtBxUser.text = user.username
self.txtBxEmail.text = user.email
}
getAccount
发出REST API请求。
如果用户在呼叫返回之前解除了视图控制器,那么回叫链会发生什么?它是否仍在运行,我认为,它仍被引用?
答案 0 :(得分:3)
我应该关注保留周期吗? tl; dr:使用安全 自我承诺的处理程序。
这是安全的:
somePromise.then { self.doSomething() }
如果somePromise解析,则传递给的函数将是 已发布,因此无需指定
[weak self]
。指定
[unowned self]
可能很危险。你告诉我不要担心保留周期?!不,这只是 默认情况下,使用时不会导致保留周期 PromiseKit。但它仍然有可能,例如:
self.handler = { self.doSomething self.doSomethingElse } somePromise.then(execute: self.handler)
我们分配的闭包
handler
强烈保留self
。handler
强烈保留self
。 这是一个典型的保留周期。不要写典型的保留周期!值得注意的是,这不是保留周期:
somePromise.then(execute: self.doSomething).then(execute: self.doSomethingElse)
答案 1 :(得分:2)
如果用户在呼叫返回之前解除了视图控制器,那么回叫链会发生什么?它是否仍在运行,我认为,它仍被引用?
是的,它确实仍在运行。
预先警告在闭包中对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
引用,这是正确的。这只是一个问题,您是否介意是否重新分配被解雇的视图控制器被推迟到履行承诺之后。)