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