swift: Grand-Central-Dispatch 但代码在主线程上执行?

swift: Grand-Central-Dispatch but code is executed on mainthread?

我正在使用地址簿框架导入数据并将联系人存储在核心数据中。该方法包装在 GCD 中,但 UI 没有响应,所有代码都在线程 1 上执行。我的代码有什么问题?

func importContacts(){

    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0)) {

            self.importContactsFromAdressbook() 
        }
}

首先,您正在使用 dispatch_get_global_queue 并指定 QOS_CLASS_BACKGROUND 作为您的操作队列。这将导致您的块在后台任务的线程中执行,而不是主线程。

The method is wrapped in GCD but the UI doesn't respond...

如果我的理解正确,您是在尝试更新块中的 UI。这是不允许的。 Cocoa UI 框架(包括 UIKit 和 AppKit)不是线程安全的。 UI 元素中的任何 update/interaction 元素都必须在主线程上完成。

因此,如果您的 importContactsFromAdressbook 与 UI 有关,您应该使用 dispatch_get_main_queue 将其发送到主线程。

可能有用:Concurrency Programming Guide