2012-03-20 60 views
9

你好(實際問題在底部)。如何通過父級MOC將更改從一個子管理對象上下文合併到另一個子管理對象上下文中?

在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]; 
}]; 

根據我的理解,這會導致父級從子上下文接收和合並更改。需要注意的一點是,必須使用相同的併發類型創建父級和所有子級。

- 編輯刪除了不正確的假設,即父級將更改推送給子級,但沒有。

+0

謝謝,我仍然有問題與提取結果控制器拿起父的保存。 hmmm:/ – Cameron 2012-03-21 22:05:54

+0

您是否正確實施了4個重要的FRC委託方法? 如果是這樣,您可以嘗試告訴您的FRC執行它的再次獲取,或者摧毀它並重新創建它。創建和銷燬FRCs是一項相對便宜的操作。我處理了一個類似的問題,但在我的情況下,我的謂詞需要有時更改。我結束了破壞和重建我的FRCs,並告訴我的桌面視圖重新加載其數據。 – afrederick 2012-03-22 15:22:01

+0

是的代表只是標準的方法。仍然沒有工作,甚至撕毀frc。將繼續嘗試不同的事情。請欣賞幫助。 – Cameron 2012-03-23 14:18:25

相關問題