4

iOS アプリケーションで、コア データを Web バックエンドと同期しようとしています。同期に別のバックグラウンド管理オブジェクト コンテキストを使用したいので、同期の処理中にメイン コンテキストが UI からの変更を自由に受け入れられるようにします。両方のコンテキストは、このブログ投稿http://www.cocoanetics.com/2012/07/multi-context-coredata/に従って、ディスクへの書き込みコンテキストの子です。

私の質問は、ディスクに保存する前に両方の子コンテキストをマージするにはどうすればよいですか?

contextDidSaveNotifications を購読すると、次を使用してコンテキストをマージできます

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

しかし、ドキュメントによると...「このメソッドは、他のコンテキストで更新されたオブジェクトを更新し、新しく挿入されたオブジェクトでエラーを発生させ、削除されたオブジェクトで deleteObject:: を呼び出します。」

更新されたオブジェクトを更新して mainContext に加えられた変更を失いたくはありませんが、両方の変更セットをマージします。

私はマルチコンテキストのコアデータを初めて使用するので、これを間違った方法で考えている可能性があります。

何か案は?

4

1 に答える 1

2

Core Data での変更のマージは、常に、1 つの管理対象オブジェクト コンテキストで変更を取得し、それらを別のコンテキストに適用するプロセスです。両方のコンテキストが同時に新しい変更を取得する可能性がある場合、マージはコンテキストのマージ ポリシーの影響を受けます。競合する変更がない場合は、心配する必要はありません。ただし、存在する可能性がある場合は、適切なマージ ポリシーを選択する必要があります。

何もしない場合のデフォルト値は です。これはNSErrorMergePolicyType、変更のマージ後に変更の保存が失敗することを意味します。あなたはほぼ確実にそれを望んでいません。ただし、選択できる定義済みのポリシーは他にもあります。NSMergeByPropertyObjectTrumpMergePolicyType保存されていない競合する変更を優先するため、多くの場合、ここでは適切な選択です。そのため、ユーザーが編集しているオブジェクトに対して同期コンテキストが競合する変更を行った場合、ユーザーの変更は保持されます。他にもいくつかの缶詰オプションがあります。どれも当てはまらない場合は、いつでもサブクラスNSMergePolicy化して、好きなことをすることができます。ただし、それが必要になることはめったにありません。

于 2013-10-28T22:15:17.083 に答える