如果一个 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核心数据 - 将实体记录复制到另一个实体

iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存

在 swift 3 中获取相关表

无法将表达式的类型“NSDictionary”转换为类型“StringLiteralConvertible”

如果是 android 放置一个按钮,或者如果它是 iOS 放置另一个按钮