我正在尝试解决因从多个线程访问相同NSManagedObjectContext
而导致的问题。我在Apple docs中找到了以下内容:
let moc = … //Our primary context on the main queue
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = moc
privateMOC.performBlock {
//...
}
这似乎是我所追求的。我还在tutorial中发现了一些非常相似的东西,它已针对iOS 9进行了更新:
let privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = coreDataStack.context.persistentStoreCoordinator
privateContext.performBlock { () -> Void in
//...
}
它们似乎都达到了相同的效果,但Apple doc的版本使用parentContext
而不是直接使用persistantStoreCoordinator
。这两种方法有什么区别?
答案 0 :(得分:1)
使用parentContext
。这是自iOS 5以来使用持久性存储协调器的方法的首选。
在OS X v10.7和iOS v5.0之前,父存储始终是持久存储协调器。在OS X v10.7及更高版本和iOS v5.0及更高版本中,父存储可以是另一个托管对象上下文。最终,上下文祖先的根必须是持久存储协调器。协调器提供托管对象模型,并将请求分派给包含数据的各种持久性存储。
在您的特定情况下:
如果上下文的父存储是另一个受管对象上下文,则获取和保存操作由父上下文而不是协调器调解。此模式有许多使用方案,包括:
- 在第二个线程或队列上执行后台操作。
来源:NSManagedObjectContext类引用," Parent Store"。