从后台线程更新UI SWIFT

3

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

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

然而我在这里阅读到,我们应该使用:此处。涉及IT技术相关内容。
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
}
}

在更新用户界面时,我的问题是:在我使用的代码示例中,UI在全局队列中更新,而且没有错误。那么我使用的方法和上面链接中提到的方法有什么区别呢?

P.S:该代码在Mac OS X 10.10上执行。

1个回答

8

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

仅限主线程类

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

  • NSCell 及其所有子代
  • NSView 及其所有子类。有关更多信息,请参阅 NSView 限制。

唯一绑定到主线程的调度队列是您可以通过 dispatch_get_main_queue() 获取的主队列。

dispatch_get_global_queue() 返回一个全局并发队列,该队列不是主队列,因此可能会在次要线程上执行其工作。因此,从此队列更新 UI 可能会偶然成功,但也可能导致延迟的 UI 更新、无法正常工作的 UI 更新或崩溃。


这正是我在寻找的,谢谢。我会将您的帖子标记为答案。 - JustADev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接