2012-03-20 7 views
9

こんにちは(実際の質問は下にあります)。親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に見られるように)保存通知からあなた自身のマージを実装しなければならなかったケースであったことを知っています。しかし、私は子供の親の文脈がこの問題を解決したと思った。私は子供と親を救おうとしましたが、違いは見えませんでした。誰かが私にこれを説明できますか? (注:これらは、個別/バックグラウンドスレッドのコンテキストではありません)

多くのおかげ

答えて

14

を、それはあなたがこのように保存しなければならないと言い、「何コアデータの新機能」のためのWWDC 2011のプレゼンテーションによると:

[child save:&error]; 
[parent performBlock:^{ 
    [parent save:&parentError]; 
}]; 

私の理解から、親は子コンテキストからの変更を受信して​​マージする。注意すべき点の1つは、親とすべての子を同じ並行性タイプで作成する必要があることです。

- 編集では、親が子供に変更をプッシュするという誤った前提が削除されました。

+0

ありがとうございます。私は引き続きフェッチされた結果コントローラが親のセーブを取得することに問題があります。 hmmm:/ – Cameron

+0

4つの重要なFRCデリゲートメソッドを正しく実装していますか? もしそうなら、FRCにフェッチを実行するように指示したり、FRCを破棄して再作成したりすることができます。 FRCの作成と破棄は、比較的安価な操作です。私は同様の問題を扱ったが、私のシナリオでは、私の述語は機会に変更する必要があった。私はFRCを破壊して再作成し、テーブルビューにデータをリロードするように指示しました。 – afrederick

+0

はい、デリゲートは単なる標準的な方法です。まだ動作していない、さらにfrcを破棄しています。さまざまなことを試し続けます。しかし、助けを感謝します。 – Cameron

関連する問題