0

新しい iOS 5 コア データ同時実行オプションを使用しています。私は2つのスレッドを持っています:

mainContext: NSMainQueueConcurrencyType
backgroundContext: NSPrivateQueueConcurrencyType, parent = mainContext

現在、メイン コンテキストによってフェッチおよび所有されている squareObject というオブジェクトがあります。このオブジェクトのプロパティを変更します。

squareObject = [getSquareObjectForContext:mainContext];
squareObject.isPendingChange = [NSNumber numberWithBool:YES];

次に、このコンテキストを保存します。ここで、backgroundContext でフェッチを実行します。

[backgroundContext performBlock^{
    ...
    pendingSquares = [[appDelegate.serverMOC executeFetchRequest:fetchRequest error:&error] mutableCopy];
    [pendingSquares filterUsingPredicate:[NSPredicate predicateWithFormat:@"isPendingChange == YES"]];
}];

ただし、アイテムは返されますが、isPendingChange の新しい値が 1 になっているアイテムはありません。

変更が backgroundContext に反映されないのはなぜですか? ドキュメントによると:

あるコンテキストで管理対象オブジェクトに加えた変更は、オブジェクトを再取得または再フォールトしない限り、別のコンテキストの対応する管理対象オブジェクトには反映されません。

そのため、再フェッチしましたが、変更はコミットされませんでした。また、backgroundContext に表示されるように変更を加えた後、mainContext を保存する必要はないと思いますよね?

正方形のオブジェクトが backgroundContext によって所有されている場合、すべて正常に動作します。

   squareObject = [getSquareObjectForContext:backgroundContext];
   squareObject.isPendingChange = [NSNumber numberWithBool:YES];

明らかに、これらの変更は backgroundContext でフェッチしたときに表示されます。これは、変更がそのコンテキストで行われたためです。まったく新しいフェッチ リクエストを使用して、子コンテキストが親コンテキストによって行われた変更をフェッチできない理由がわかりません。このやり方だと思った?

4

1 に答える 1

1

そのため、再フェッチしましたが、変更はコミットされませんでした。また、mainContext を変更して backgroundContext に表示するように変更した後、mainContext を保存する必要はないと思いますよね?

この仮定は正しくありません。親コンテキストに変更を表示するには、子コンテキストを保存する必要があります。

ただし、親コンテキストを保存すると、最初に子コンテキストの保存が自動的にトリガーされます。

保存しても、フェッチすると子コンテキストに表示されません。

これは、変更が子から親に伝達されるためであり、その逆ではありません。

于 2012-06-29T07:53:31.747 に答える