【问题标题】:weak self be used in DispatchQueue在 DispatchQueue 中使用弱自身
【发布时间】:2021-03-24 02:28:23
【问题描述】:

这是一个简单的 API 类,如下所示。

class API {
    func fetchData(_ callback: @escaping (Data) -> Void) {
        // reqeust to server...
        callback(response)
    }
}

当我们在下面的代码中调用fetchData 时,我们使用[weak self] 来防止保留循环。
我正在使用DispatchQueueue.main.async 来更新主线程中的 UI。
我也需要[weak self]吗?
哪个是正确的,fooAfooB

class MyViewController: UIViewController {
    let api = API()
    
    func fooA() {
        api.fetchData { [weak self] data in
            self?.doSomething()
            DispatchQueue.main.async { [weak self] in
                self?.updateUI(data)
            }
        }
    }
    
    func fooB() {
        api.fetchData { [weak self] data in
            self?.doSomething()
            DispatchQueue.main.async {
                self?.updateUI(data)
            }
        }
    }
}

【问题讨论】:

  • 我这里也需要[弱自我]吗? - 不,你不需要。
  • 当然[weak self] 必须在两个地方。这两个块都是独立的,并且是异步的。您可能会完成 fetchData,安排 updateUI 的执行,并且在它有时间发生之前,您的视图控制器已经准备好死亡。所以要平静地死去,它需要第二个【弱我】

标签: swift memory memory-leaks grand-central-dispatch ownership-semantics


【解决方案1】:

weakunowned 传播:

api.fetchData { [weak self] data in
  // do something with self
  DispatchQueue.main.async { // weak inherited
    // update UI with data
  }
}

【讨论】:

  • 我更喜欢用 cmets 来解释,因为它们与位置有关。
猜你喜欢
  • 2014-03-26
  • 2019-10-15
  • 2018-05-01
  • 1970-01-01
  • 2021-06-07
  • 2013-10-01
  • 2018-05-09
  • 2022-08-24
  • 1970-01-01
相关资源
最近更新 更多