【发布时间】:2014-08-27 09:17:03
【问题描述】:
我不确定这是怎么回事,但我可以寻求帮助。每次用户在 UITextField 中输入文本时,我都会尝试在后台执行查询。我一直在阅读,看起来这就是我应该如何执行后台 CoreData 操作,但我不断收到此错误:
“只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlock:”
我用谷歌搜索了这个错误,但每个解决方案都说我的上下文需要使用 PrivateQueueConcurrentcyType 创建,我这样做了。不知道为什么会这样。可能是新 iOS 的 bug?
let managedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
if !textField.text.isEmpty {
manatedObjectContext.performBlock {
let objectIDs = //query to get the object IDs
appDelegate.managedObjectContext.performBlock {
var objects = Object[]()
for id in objectsIDs {
objects += appDelegate.managedObjectContext.objectWithID(id) as Object
}
self.searchResults = objects
self.searchResultsTableView.reloadData()
}
}
}
编辑:我通过执行以下操作解决了我的问题:
- 将私有 managedObjectContext 的父上下文设置为来自 AppDelegate 的主上下文
- 我删除了设置持久存储的行,因为在将父上下文设置为主上下文时不再需要它
- 我还更改了创建主上下文的默认实现,以使用 MainQueueConcurrencyType 显式创建它
【问题讨论】:
-
Nice Swift (-: 你可能对
managedObjectContext.psc = appDelegate.psc有问题。你可能应该让你的threadMOC依赖 使用mainMOC来代替-setParentContext:. 请参阅下面的完整示例。 -
@gothicdev 谢谢!设置父上下文并更改使用“MainQueueConcurrencyType”显式创建的主上下文修复了该问题。
标签: ios objective-c core-data swift