Swift线程处理:什么时候使用DispatchQueue.main.async?

Yun*_*Gun 4 user-interface multithreading swift

我相信我知道调用它时调度队列在做什么,但是我不确定何时应该确切地使用它,以及当我使用它时它的优点是什么。

如果我的理解是正确的,DispatchQueue.main.async { // code }将调度包含在闭包中的代码以异步方式在主调度队列上运行。主队列具有最高优先级,通常保留用于更新UI以最大化App响应能力。

我感到困惑的地方是:更新调度队列闭包中的UI元素与只在闭包外的同一位置编写代码有什么区别?在加载了方法的视图主体中执行代码而不是将其发送到调度队列是否更快?如果没有,为什么?

代码示例:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        updateUI()
    }

}
Run Code Online (Sandbox Code Playgroud)

与:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        DispatchQueue.main.async {
            updateUI()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个会更快更新UI?

rma*_*ddy 8

的主要用途DispatchQueue.main.async是在后台队列上运行代码并且需要在主队列上执行特定代码块时。

在您的代码中,viewDidLoad该代码已经在主队列上运行,因此没有必要使用DispatchQueue.main.async

但是使用它不一定是错误的。但是它确实改变了执行顺序。

没有以下示例:

class MyViewController: UIViewController {
    func updateUI() {
        print("update")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("before")
        updateUI()
        print("after")
    }
}
Run Code Online (Sandbox Code Playgroud)

如人们所料,输出将是:


更新
之后

现在添加DispatchQueue.main.async

class MyViewController: UIViewController {
    func updateUI() {
        print("update")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("before")
        DispatchQueue.main.async {
            updateUI()
        }
        print("after")
    }
}
Run Code Online (Sandbox Code Playgroud)

输出更改:

之前
之后
更新

这是因为异步闭包在当前runloop完成之后排队等待运行。

  • 我们如何知道哪些函数在主队列中运行或没有运行? (2认同)
  • `print("主队列是:\(Thread.isMainThread)")` (2认同)