我相信我在调用它时了解调度队列在做什么,但我不确定我应该在什么时候使用它以及当我使用它时它的优势是什么。
如果我的理解是正确的,DispatchQueue.main.async {//code }
将安排闭包中包含的代码以异步方式在主调度队列上运行。主队列具有最高优先级,通常保留用于更新 UI 以最大化应用响应。
我感到困惑的地方是:在调度队列闭包内更新 UI 元素与仅在闭包外的同一位置编写代码究竟有什么区别?在加载方法的 View 主体中执行代码比将它发送到调度队列更快吗?如果不是,为什么?
代码示例:
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
updateUI()
}
}
对比:
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
updateUI()
}
}
}
哪个会更快地更新 UI?
最佳答案
DispatchQueue.main.async
的主要用途是当您有代码在后台队列上运行并且您需要在主队列上执行特定代码块时。
在您的代码中,viewDidLoad
已经在主队列上运行,因此没有理由使用 DispatchQueue.main.async
。
但使用它不一定是错误的。但它确实改变了执行顺序。
例子没有:
class MyViewController: UIViewController {
func updateUI() {
print("update")
}
override func viewDidLoad() {
super.viewDidLoad()
print("before")
updateUI()
print("after")
}
}
正如人们所期望的那样,输出将是:
before
update
after
现在添加DispatchQueue.main.async
:
class MyViewController: UIViewController {
func updateUI() {
print("update")
}
override func viewDidLoad() {
super.viewDidLoad()
print("before")
DispatchQueue.main.async {
updateUI()
}
print("after")
}
}
输出改变:
before
after
update
这是因为异步闭包在当前运行循环完成后排队等待运行。
关于Swift 线程 : When to use DispatchQueue. main.async?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50727122/