6

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

    _ = accountService.getAccount()

      .then { user -> Void in

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

getAccount发出 REST API 请求。

如果用户在调用返回之前关闭视图控制器,那么回调链会发生什么?考虑到它是否仍然运行,我想它仍然被引用?

4

2 回答 2

2

我应该担心保留周期吗?tl; dr:在 promise 处理程序中使用 self 是安全的。

这是安全的:

somePromise.then {
    self.doSomething()
}

如果 somePromise 解析,传递给 then 的函数将被释放,因此[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)

来源

于 2017-04-01T17:02:34.130 回答
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 - 我是否应该关注 Retain Cycles中,PromiseKit 文档指出您不需要weak引用,这是正确的。这只是您是否介意解除分配的视图控制器的问题推迟到承诺履行后。)

于 2017-04-01T18:26:58.877 回答