承诺被放弃会发生什么?

时间:2017-04-01 16:54:35

标签: ios swift asynchronous promisekit

我在视图控制器中定义了以下代码。

    _ = accountService.getAccount()

      .then { user -> Void in

         self.txtBxUser.text = user.username
         self.txtBxEmail.text = user.email
   }

getAccount发出REST API请求。

如果用户在呼叫返回之前解除了视图控制器,那么回叫链会发生什么?它是否仍在运行,我认为,它仍被引用?

2 个答案:

答案 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强烈保留selfhandler强烈保留self。   这是一个典型的保留周期。不要写典型的保留周期!

     

值得注意的是,这不是保留周期:

 somePromise.then(execute: self.doSomething).then(execute: self.doSomethingElse)

source

答案 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引用,这是正确的。这只是一个问题,您是否介意是否重新分配被解雇的视图控制器被推迟到履行承诺之后。)