7

我正在学习CoreData。很显然,您所介入的主要类之一是NSManagedObjectContext。我不清楚这个的确切作用。从我读过的文章看来,你可以拥有多个NSManagedObjectContexts。这是否意味着NSManagedObjectContext基本上是后端的副本?NSManagedObjectContext混淆

当有多个不同的副本存在时,这将如何解析为一致的后端?

所以,2个问题基本上是:

是NSManagedContext后端数据库的副本?

和...

例如,假设我让上下文中的变化,并在背景B.然后我把一些其他的变化上保存第一,然后是B? B会胜出吗?

感谢

回答

11

NSManagedObjectContext不是后端数据库的副本。所述documentation描述为一个高速暂存

的NSManagedObjectContext的实例表示一个单一的“对象 空间”或高速暂存在应用程序中。它的主要责任是管理一个被管理对象的集合,其中包括 。这些对象形成相关模型对象的组 ,这些对象表示一个或多个持久存储的内部一致视图 。单个托管对象实例 仅存在于一个上下文中,但对象 的多个副本可以存在于不同的上下文中。因此,对象分配的范围是特定的上下文。

NSManagedObjectContext只是一个以事务方式更改托管对象的临时位置。在上下文中对对象进行更改时,如果保存上下文,则不会影响后端数据库,并且您知道可以有多个上下文,您可以对其进行更改,对concurrency这一点非常重要。

对于问题编号2,谁胜出的答案将取决于您为上下文设置的merge policy以及哪一个被称为上一个将是B.下面是可以设置的合并策略,它将影响第二个上下文被保存。

NSErrorMergePolicyType
指定导致保存失败 如果有任何合并冲突的政策。

NSMergeByPropertyStoreTrumpMergePolicyType
指定 融合持久性存储的版本对象 的和当前的内存版本之间的冲突,对外界变化 优先的政策。

NSMergeByPropertyObjectTrumpMergePolicyType
指定合并持久性存储的对象的 版本和当前内存版本之间的冲突,以 内存的变化优先的政策。

NSOverwriteMergePolicyType
指定 覆盖状态持久存储在 冲突发生改变的对象的政策。

NSRollbackMergePolicyType
指定一个策略, 丢弃内存在冲突对象的状态的变化。

+0

“并发性”。链接已过期。 – 2016-01-21 03:15:43

+0

@ Mr.UB解决,谢谢。 – Joe 2016-01-25 15:21:56

2

NSManagedObjectContext是您的数据模型的特定表示。每个上下文保持其自己的状态(例如上下文),因此一个上下文中的更改不会直接影响其他上下文。当您处理多个上下文时,您有责任在上下文将更改保存到商店时通过合并更改来保持它们的一致性。

你的问题是关于这个过程,也可能涉及合并冲突。无论何时保存上下文,都会将其更改提交到商店,并使用合并策略来解决冲突。

当您保存上下文时,它将发布各种有关进度的通知。在你的情况下,如果[contextA save:&error]成功,上下文将发布通知NSManagedObjectContextDidSaveNotification。当你有多个上下文,您通常看到此通知,并呼吁:

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

这将合并保存在contextAcontextB的变化。

编辑:删除'线程安全'的评论。 NSManagedObjectContext不是线程安全的。