Swift 核心数据异步获取在主线程上结束
我正在尝试执行一个异步请求,作为我的应用程序中搜索结果更新程序的一部分 我编写了以下代码Swift 核心数据异步获取在主线程上结束,swift,core-data,Swift,Core Data,我正在尝试执行一个异步请求,作为我的应用程序中搜索结果更新程序的一部分 我编写了以下代码 func updateSearchResults(for searchController: UISearchController) { guard let text = searchController.searchBar.text else {return} let threadingContext = NSManagedObjectContext(concurr
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text else {return}
let threadingContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
threadingContext.parent = self.context
DispatchQueue.global(qos: .userInitiated).async {
let fetchRequest = MyObject.fetchRequest() as NSFetchRequest<MyObject>
fetchRequest.predicate = get_predicate(text)
do {
let objects = try threadingContext.fetch(fetchRequest).map({ object in
return object.objectID
})
}
catch {return}
DispatchQueue.main.async {
// Pass results to the search view controller
}
}
}
func updateSearchResults(对于searchController:UISearchController){
guard let text=searchController.searchBar.text else{return}
让threadingContext=NSManagedObjectContext(并发类型:.privateQueueConcurrencyType)
threadingContext.parent=self.context
DispatchQueue.global(qos:.userInitiated).async{
让fetchRequest=MyObject.fetchRequest()作为NSFetchRequest
fetchRequest.predicate=获取谓词(文本)
做{
let objects=尝试threadingContext.fetch(fetchRequest.map)({object in
返回object.objectID
})
}
捕获{return}
DispatchQueue.main.async{
//将结果传递给搜索视图控制器
}
}
}
但是UI仍然很慢(即使我没有做任何显示更新),并且查看时间分析器,我发现我的主线程80%的时间都花在以下方面:
因此,我的请求似乎仍然被发送到主线程,我不明白。有人会看到我的错误吗
(我在上面尝试了几种方法,例如使用
threadingContext。执行,但结果相同)好的,我理解了,我应该阅读苹果的文档,但基本上
如果上下文的父存储是另一个托管对象上下文,则获取和保存操作由父上下文而不是协调器进行中介
这有点微妙,但是如果对获取请求执行的操作(而不是获取请求本身)很慢,那么我的构造会很有用
解决方案是设置threadingContext.persistentStoreCoordinator