1

1 つの NSManagedObject をメイン コンテキストから編集コンテキストにコピーする必要がある状況があります。Stackoverflow で説明されている同様の状況で見たように、ほとんどの人にとっては不必要に思えますが、必要なようです。

私のアプリでは、タブ バーに多くのビューがあり、すべてのビューは他のビューに関連するさまざまな情報を処理します。ユーザーがタブからタブにジャンプして一部のタブに保存されていない変更を残す可能性があるため、複数のMOCが必要だと思いますが、他のタブ/ビューにデータを保存する可能性があるため、それが発生した場合、残りのビューの変更はユーザーの同意なしに保存されます最悪の場合、アプリがクラッシュします。

新しい情報を追加するには、追加の MOC を使用して、両方の MOC の変更をマージすることで解決しましたが、編集はそれほど簡単ではありません。ここStackoverflowでも同様の状況を見ましたが、データモデルが関係にNSMutableSetを使用していないように見えるため、アプリがクラッシュします(多対多の関係ではなく、1対多だと思います)属性であるかのように関係を取得できるように変更できると思います

for (NSString *attr in relationships) {
    [cloned setValue:[source valueForKey:attr] forKey:attr];
}

しかし、複製されたオブジェクトと元のオブジェクトの変更をマージする方法がわかりません。メインコンテキストからオブジェクトを削除し、両方のコンテキストをマージして変更をメインコンテキストに保存するだけでよいと思いますが、正しい方法かどうかはわかりません。また、逆の関係が元のオブジェクトと同じように複製されたオブジェクトへの参照を保持するかどうかわからないため、データベースの整合性についても懸念しています。

誰かがこれについて私に教えてもらえますか?

4

1 に答える 1

3

うわー、これにはたくさんの質問とランダム性があります。まず、自分の質問にコメントを追加する必要はありません。質問自体を編集することをお勧めします。

NSManagedObjectContext次に、シングル スレッド アプリケーションを実行している場合、複数のインスタンスは必要ありません。アプリケーション全体を単一のインスタンスから簡単に実行できます。複数のコンテキストは、まれなエッジ ケースとマルチスレッドの状況向けです。

単一のコンテキストを使用することで、複製の試みに関するすべての問題が解決されます。ただし、まだ a のディープ コピーを作成する方法がわからない場合は、 The Pragmatic Programmers のNSManagedObject私の著書にあるサンプル コードからガイダンスを得ることができます。ソースコードは無料でダウンロードできます。

アップデート

すべてのNSManagedObjectContextインスタンスは「編集中のもの」です。スレッドごとに 1 つのコンテキストのみが必要です。挿入されていないエンティティを保存する前に削除する場合は、そのコンテキストを簡単に尋ねることができ、変更されたエンティティを簡単に保存できます。いくつかの極端なエッジ ケースを除いて、2 番目のコンテキストは必要ありません。

アップデート

あなたはまだ自分のために必要以上の仕事をしています。ビューを消すためにオブジェクトを保存する必要はありません。コンテキスト内に未保存の状態で必要な数のオブジェクトを残すことができます。

オブジェクトのディープ コピーを処理するためのデバッグに、説明している設計の価値よりも多くの時間を費やすことになります。複数のコンテキストを使用する場合はNSPersistentStoreCoordinator、オブジェクトをコピーする必要がないように、それらが同じコンテキストにアタッチされていることを確認してください。「セカンダリ」コンテキストを保存して、メインで保存通知をキャッチできます。環境。

于 2010-06-12T21:29:29.547 に答える