Как объединить изменения из контекста одного дочернего управляемого объекта в другой через родительский 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). Но я думал, что контексты ребенок-родитель решили эту проблему.Я пытался спасти ребенка, а затем родителя, но, похоже, ничего не изменилось. Может кто-нибудь объяснить мне это, пожалуйста? (Примечание: это не контексты в отдельных/фоновых потоках)

Большое спасибо

9
задан John Topley 30 June 2012 в 17:28
поделиться