如果一个 NSManagedObjectContext 实例同时保存在两个线程中怎么办?
Posted
技术标签:
【中文标题】如果一个 NSManagedObjectContext 实例同时保存在两个线程中怎么办?【英文标题】:what if one NSManagedObjectContext instance is saved simultaniously in two threads? 【发布时间】:2013-01-19 14:05:34 【问题描述】:在我的应用程序中,我创建了一个 NSManagedObjectContext 实例,两个线程可以访问这个实例,它们都需要提交更改。如果在两个线程中同时调用 save 方法会怎样?上下文中所有 NSManagedObject 实例的属性会发生什么变化?
【问题讨论】:
【参考方案1】:你不应该那样做。为每个线程创建两个单独的 NSManagedObjectContext。CoreData 不是线程安全的。在使用 CoreData 进行多线程之前请阅读此文档
Concurrency with Core Data
【讨论】:
【参考方案2】:NSPersistentStoreCoordinator 将在多个线程或队列上为 NSManagedObjectContexts 处理正确的锁定,但 NSManagedObjectContext 本身应该只在一个线程上使用,即创建它的线程(常见错误是在主线程上创建一个 MOC,然后将其传递给另一个线程 - 不要这样做)。
正如 Tony 所指出的,您希望为每个线程拥有一个 MOC,共享一个持久存储协调器,或者使用 ios 5 中引入的 Core Data 的新并发模式,允许您创建子上下文和/或使用新的performBlock 和 performBlockAndWait 方法保证上下文在正确的线程上执行。
您的问题的直接答案是“谁知道”。该行为将是未定义的,您几乎肯定会遇到随机崩溃和/或死锁。
【讨论】:
以上是关于如果一个 NSManagedObjectContext 实例同时保存在两个线程中怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Interface Builder 的 XIB 传递 NSManagedObjectContext
iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存