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
将其发送到主线程。
我正在使用地址簿框架导入数据并将联系人存储在核心数据中。该方法包装在 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
将其发送到主线程。