【问题标题】: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 强烈保留 selfhandlerself 强烈保留。 这是一个典型的保留周期。不要编写典型的保留周期!

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

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

      source

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 2018-02-14
        相关资源
        最近更新 更多