swift:Grand-Central-Dispatch但代码在mainthread上执行?

时间:2015-05-24 15:59:18

标签: ios grand-central-dispatch

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

func importContacts(){

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

            self.importContactsFromAdressbook() 
        }
}

1 个答案:

答案 0 :(得分:3)

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

  

该方法包含在GCD中,但UI不响应...

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

因此,如果您的importContactsFromAdressbook涉及用户界面,则应使用dispatch_get_main_queue将其发送到主线程。

可能有用:Concurrency Programming Guide