DispatchQueue.main.async { // code } 将安排闭包中包含的代码以异步方式在主调度队列上运行。主队列具有最高优先级,通常保留用于更新UI以最大程度地提高App响应速度。
令人困惑的是:更新调度队列闭包中的UI元素与只在闭包外的同一位置编写代码有什么不同?在加载了方法的视图主体中执行代码而不是将其发送到调度队列中,执行代码的速度更快吗?
代码示例一:
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
这是因为异步闭包在当前runloop完成之后排队等待运行。