Swift 线程 : When to use DispatchQueue. main.async?

标签 swift multithreading user-interface

我相信我在调用它时了解调度队列在做什么,但我不确定我应该在什么时候使用它以及当我使用它时它的优势是什么。

如果我的理解是正确的,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/

相关文章:

java - 为什么 Kotlin/Java 没有抢占式调度程序的选项?

multithreading - “free-threaded”和 “thread-safe”之间的区别

user-interface - GUI 应用程序中的 Web 技术

swift - MPSNNGraph reshape 节点

swift - 使用 alamofire 排队

java - 简单的 Ping Pong Java 线程

javascript - 从具有多个按钮的模态返回一个值( react )

flutter - 如何在 flutter 中创建已弃用的文本?

ios - UIView subview 未接收到触摸

ios - CBPeripheralManager.updateValue 与 CBPeripheral.writeValue?