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不是線程安全的。