在我的 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,请告诉我!