从后台线程SWIFT更新UI

Oma*_*reh 2 macos user-interface multithreading swift

我正在使用此代码进行后台工作:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, {
        // Some work in the background and updating UI too.
    });
Run Code Online (Sandbox Code Playgroud)

但我在这里读到我们应该使用:

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
dispatch_async(dispatch_get_main_queue()) {
    // update some UI
}
}
Run Code Online (Sandbox Code Playgroud)

更新UI时.我的问题是:在我使用的代码示例中,UI在全局队列中得到更新,UI更新没有错误.我正在使用的方法与上面链接中提到的方法有什么区别?

PS:代码在Mac OS X 10.10上执行

Mar*_*n R 7

"线程编程指南"中的线程安全摘要指出:

主线程仅限类

必须仅从应用程序的主线程使用以下类.

  • NSCell 及其所有后代
  • NSView及其所有后代.有关更多信息,请参阅NSView限制.

绑定到主线程的唯一调度队列是您获得的主队列dispatch_get_main_queue().

dispatch_get_global_queue()返回一个不是主队列的全局并发队列,因此可以在辅助线程上执行其工作.因此,从此队列更新UI 可能会偶然发挥作用,但它也可能导致UI更新延迟,非工作UI更新或崩溃.