7

私はCoreDataについて学んでいます。明らかに、あなたが取り入れている主なクラスの1つはNSManagedObjectContextです。私はこれの正確な役割については不明です。私が読んだ記事から、複数のNSManagedObjectContextを持つことができるようです。これは、NSManagedObjectContextが基本的にバックエンドのコピーであることを意味しますか?NSManagedObjectContextの混乱

複数の異なるコピーがある場合、どのようにして一貫したバックエンドに解決されますか?

ので、2つの質問は基本的:

はNSManagedContextは、バックエンドデータベースのコピーですか?例えば

と...

、そして、私は最初、その後、Bに対してsaveを呼び出す私は、コンテキストAの変更を行い、コンテキストBの他のいくつかの変更を行うと言いますか? Bは勝つだろうか?

おかげ

答えて

11

NSManagedObjectContextは、バックエンドデータベースのコピーではありません。 documentationは、スクラッチパッド

NSManagedObjectContextのインスタンスは、アプリケーション内の単一の「オブジェクト スペース」またはスクラッチパッドを表すとして記載されています。管理対象オブジェクトのコレクションを管理する主な責任は です。これらのオブジェクトは、1つまたは複数の永続ストアの内部で一貫性のあるビュー を表す関連するモデルオブジェクトのグループ を形成します。 1つの管理オブジェクトインスタンス が唯一の1つのコンテキストに存在しますが、オブジェクト の複数のコピーが異なるコンテキストに存在する可能性があります。したがって、オブジェクトのユニーク化は、特定のコンテキストで にスコープされます。

NSManagedObjectContextは、管理対象オブジェクトをトランザクション方式で変更するための一時的な場所です。コンテキスト内のオブジェクトを変更すると、コンテキストを保存するまで、またコンテキストが複数ある場合は、concurrencyにとって本当に重要な変更を加えることができるまで、バックエンドデータベースには影響しません。

質問2の場合、誰のための答えはあなたのコンテキストに設定したmerge policyと、Bとなるlastと呼ばれるものによって決まります。ここでは、2番目のコンテキスト救われるべきです。

NSErrorMergePolicyType
は、任意のマージの競合がある場合は を失敗する原因となる保存ポリシーを指定します。 NSMergeByPropertyStoreTrumpMergePolicyType


は は、外部 変更を優先して、永続ストアのオブジェクト のバージョンと現在のメモリ内のバージョン間の競合をマージポリシーを指定します。


NSMergeByPropertyObjectTrumpMergePolicyTypeは 、メモリ内の変化を優先し、永続ストアのオブジェクトのバージョン と現在のメモリ内のバージョン間の競合をマージポリシーを指定します。 NSOverwriteMergePolicyType


は が 紛争で変更されたオブジェクトの永続ストアに状態を上書きするポリシーを指定します。

NSRollbackMergePolicyType
は紛争中のオブジェクトの 破棄し、メモリ内の状態変化ポリシーを指定します。

+0

"並行性"リンクは有効期限切れです。 –

+0

@ Mr.UB解決済み、ありがとうございます。 – Joe

2

NSManagedObjectContextは、データモデルの特定の表現です。各コンテキストはそれ自身の状態(例えばコンテキスト)を維持するので、あるコンテキストにおける変更は他のコンテキストに直接影響しない。複数のコンテキストで作業する場合は、コンテキストが変更をストアに保存したときに変更をマージすることで、それらを一貫性を維持する責任があります。

あなたの質問はこのプロセスに関するもので、マージの競合も含まれている可能性があります。コンテキストを保存すると、その変更はストアにコミットされ、マージポリシーが競合を解決するために使用されます。

コンテキストを保存すると、進行状況に関するさまざまな通知が送信されます。あなたのケースでは、[contextA save:&error]が成功すると、コンテキストはNSManagedObjectContextDidSaveNotificationという通知を送信します。複数のコンテキストを持っているときは、通常、この通知を遵守し、呼び出し:

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

これはcontextBcontextAに保存された変更をマージします。

EDIT:スレッドセーフなコメントを削除しました。 NSManagedObjectContextはスレッドセーフではありません。