こんにちは(実際の質問は下にあります)。親MOCを介して、1つの子管理オブジェクトコンテキストから別の子管理オブジェクトコンテキストへの変更をマージする方法はありますか?
iOS 5では、CoreDataに親子の管理オブジェクトコンテキストが導入されています。
標準のNSFetchedResultsControllerとUITableVeiwControllerが協力して、ストアからマスターリストをフェッチしています。フェッチ結果コントローラの管理対象オブジェクトコンテキストは親コンテキストを持つ子である:
// AppDelegate.m
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// primary managed object context has NSPrivateQueueConcurrencyType
[__managedObjectContext setParentContext:[self primaryObjectContext]];
return __managedObjectContext;
}
テーブルビューコントローラが新しいレコードを追加するために、モーダルビューコントローラを提示したが、(そうする、このコンテキストを別々の管理対象オブジェクトコンテキストを使用しています親コンテキストの別の子です)。このコンテキストは、テーブルビューコントローラにデリゲートコールバックで保存されます:
- (void)addGame
{
// New child context
[self setBuildManagedObectContext:[[NSManagedObjectContext alloc] init]];
[[self buildManagedObectContext] setParentContext:[[[self team] managedObjectContext] parentContext]];
Team *buildTeam = (Team *)[[self buildManagedObectContext] objectWithID:[[self team] objectID]];
Game *buildGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game"
inManagedObjectContext:[self buildManagedObectContext]];
[buildGame setTeam:buildTeam];
BuildViewController *buildVC = [[BuildViewController alloc] initWithGame:buildGame delegate:self];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:buildVC];
[[self navigationController] presentViewController:navCon animated:YES completion:nil];
}
#pragma mark - Build view controller delegate
- (void)buildViewController:(BuildViewController *)controller didFinishWithSave:(BOOL)save
{
if (save)
{
NSError *error = nil;
if (![[self buildManagedObectContext] save:&error])
{
NSLog(@"Error saving new game");
abort();
}
}
[self setBuildManagedObectContext:nil];
[[self navigationController] dismissViewControllerAnimated:YES completion:nil];
}
質問:
親子コンテキストで、親コンテキストがその子から通知を救うになるだろうというのが私の理解だった、すべての子供に通知します。したがって、私の例では、ビルドコンテキストは親コンテキストをトリガして、フェッチされた結果コントローラに変更をマージするよう指示します。
これは私には起こりませんが、レコードは正常に作成されましたが、フェッチされた結果コントローラはそれらを取得していません。私はそれがあなたが(CoreDataBooksに見られるように)保存通知からあなた自身のマージを実装しなければならなかったケースであったことを知っています。しかし、私は子供の親の文脈がこの問題を解決したと思った。私は子供と親を救おうとしましたが、違いは見えませんでした。誰かが私にこれを説明できますか? (注:これらは、個別/バックグラウンドスレッドのコンテキストではありません)
多くのおかげ
ありがとうございます。私は引き続きフェッチされた結果コントローラが親のセーブを取得することに問題があります。 hmmm:/ – Cameron
4つの重要なFRCデリゲートメソッドを正しく実装していますか? もしそうなら、FRCにフェッチを実行するように指示したり、FRCを破棄して再作成したりすることができます。 FRCの作成と破棄は、比較的安価な操作です。私は同様の問題を扱ったが、私のシナリオでは、私の述語は機会に変更する必要があった。私はFRCを破壊して再作成し、テーブルビューにデータをリロードするように指示しました。 – afrederick
はい、デリゲートは単なる標準的な方法です。まだ動作していない、さらにfrcを破棄しています。さまざまなことを試し続けます。しかし、助けを感謝します。 – Cameron