0

在我的 iOS 应用程序中,我提出了很多网络请求。当这些请求成功/失败时,会触发视图控制器中的委托方法。委托方法包含负责更新 UI 的代码。在以下示例didUpdate(foo:)中是委托方法,并且presentAlert(text:)是我的 UI 更新。

如果没有DispatchQueue,代码将如下所示:

func didUpdate(foo: Foo) {
  self.presentAlert(text: foo.text)
}

func presentAlert(text: String) {
  let alertController = ...

  self.present(alertController, animated: true)
}

当谈到使用DispatchQueue以确保我的 UI 将快速更新时,我开始失去判断代码中实际发生的事情的能力。以下两种实现之间有什么区别吗?

第一种方式:

func didUpdate(foo: Foo) {
  self.presentAlert(text: foo.text)
}

func presentAlert(text: String) {
  let alertController = ...

  DispatchQueue.main.async {
    self.present(alertController, animated: true)
  }
}

第二种方式:

func didUpdate(foo: Foo) {
  DispatchQueue.main.async {
    self.presentAlert(text: foo.text)
  }
}

func presentAlert(text: String) {
  let alertController = ...

  self.present(alertController, animated: true)
}
  • 我采用哪种方法有关系吗?似乎在presentAlert函数内部有 DispatchQueue 块更好,所以我不必包括DispatchQueue.main.async任何我想调用的时间presentAlert

  • 当您(或您正在使用的框架)将自己“移动”到后台队列时,是否只需要显式地将块发送到主队列?

  • 如果有任何外部资源可以帮助我理解 GCD,请告诉我!

4

1 回答 1

1

我采用哪种方法有关系吗?似乎在 presentAlert 函数中包含 DispatchQueue 块更好,所以我不必在任何时候都包含 DispatchQueue.main.async 我想调用 presentAlert?

这两种方法没有区别。但是,正如您所说,第二种方法的缺点是您必须将所有调用包装在闭包presentAlert周围。DispatchQueue.main.async

当您(或您正在使用的框架)将自己“移动”到后台队列时,是否只需要显式地将块发送到主队列?

如果您的问题是如果您从主队列分派到主队列是否会出现问题,那么答案是否定的。如果您从主队列中异步调度主队列,它所做的只是稍后在运行循环中调用您的方法。

如果有任何外部资源可以帮助我理解 GCD,请告诉我!

互联网上有很多资源可以更好地了解 GCD。看看这个Raywenderlich 教程。这是一个很好的起点。

我的建议是,如果您有一个处理所有 Web 服务调用的中心类,那么在获得 Web 服务响应后解析数据后,最好在主队列上调用完成回调闭包。这样,您就不必在视图或视图控制器类中继续分派到主队列。

于 2018-09-27T22:41:03.690 回答