4

私はこのバグで頭を壁にぶつけています。基本的に、関係はあるコンテキストから別のコンテキストに正しくマージされていません。

モデルに Student と Teacher という 2 つのエンティティ タイプがあるとします。生徒は 1 人の教師しか持つことができず、教師は明らかに多くの生徒を持つことができます。これを xcdatamodel クラスで正しく設定しました。

サーバーからこれらのエンティティを同期しているため、2 つの管理対象オブジェクト コンテキストuiContextNSMainQueueConcurrencyTypeありbackgroundContextますNSPrivateQueueConcurrencyType

を使用してネストされた構造もセットアップしました[self.uiContext setParentContext:self.backgroundContext];

だからこれは私がやっていることです:

1) サーバーから教師を取得する

2)それらの管理対象オブジェクトを作成しますbackgroundContext

save 3 ) 呼びかけるbackgroundContext

4) をリッスンしNSManagedObjectContextDidSaveNotification、次のコードを実行します。

[self.uiContext performBlock:^(void) {
   [self.uiContext mergeChangesFromContextDidSaveNotification:notif];
}];

これまでのところ、これはうまく機能します。私の uiContext は教師が管理するオブジェクトを取得し、それに応じて UI が更新されます。

ただし、次のことを行うと故障します。

5) サーバーから学生データを取得する

6) で管理対象オブジェクトを作成し、生徒から適切な教師への関係backgroundContextを設定します。

7) 電話save をかけるbackgroundContext

NSManagedObjectContextDidSaveNotification8)通知を聞いているので、この保存はuiContext

ただし、ここで問題が発生し始めます。学生オブジェクトが正しくマージされても、uiContext教師から学生への関係は設定されていません。生徒から教師への関係は正しく設定されていますが、その逆ではありません。具体的にです[someTeacherObject.students count] == 0が、someStudentObject.teacher != nil

と永続ストアの両方で関係が正しく設定されていbackgroundContextます (検証済み)。ではありませんuiContext

何が起こっているのでしょうか?これをより適切にデバッグする方法はありますか?

4

1 に答える 1

0

私が知る限り、バックグラウンド コンテキストに parentContext を設定すると、変更をリッスンして手動でマージする必要がなくなります。saveContext:ただし、変更をストアに保存するには、メイン コンテキストで追加の操作を実行する必要があります。

詳細については、マルチコンテキスト コア データに関するこの記事の「親/子コンテキスト」セクションを参照してください。

編集

その記事から引用すると、コードは次のようになります。

[backgroundContext performBlock:^{
// do something that takes some time asynchronously using the bg context

   // push to parent
   NSError *error;
   if (![backgroundContext save:&error])
   {
       // handle error
   }

   // save parent to disk asynchronously
   [mainMOC performBlock:^{
        NSError *error;
        if (![mainMOC save:&error])
        {
           // handle error
        }
    }];
}];
于 2013-01-20T10:15:21.107 に答える