Изменения, сохраненные из одного NSManagedObjectContext, не отражают основной NSManagedObjectContext

У меня есть основной NSManagedObjectContext который создан в appDelegate.

Теперь я использую другой NSManagedObjectContext для редактирования/добавления новых объектов, не затрагивая основной NSManagedObjectContext, пока я не сохраню их.

Когда я сохраняю второй NSManagedObjectContext, изменения не отражаются в основном NSManagedObjectContext, но если я открою базу данных .sqlite из симулятора, изменения будут правильно сохранены в базе данных .sqlite. Не имеет значения, получу ли я данные снова или даже если создам третий NSManagedObjectContext, я не могу увидеть эти изменения во втором NSManagedObjectContext, несмотря на тот факт, что эти изменения действительно существуют на диске на данный момент.

Если я выйду и снова открою приложение, все изменения будут.

Что может привести к тому, что основной NSManagedObjectContext не увидит новые изменения, присутствующие в постоянном хранилище?

До этого подхода я использовал один NSManagedObjectContext и undoManager, но я хотел изменить его, чтобы использовать два разных NSManagedObjectContext.

Второе сохранение NSManagedObjectContext:

    NSError* error = nil;

    if ([managedObjectContext hasChanges]) {
        NSLog(@"This new object has changes");
    }

    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

Ответы

Ответ 1

Если вы этого еще не сделали, я предлагаю прочитать документацию Apple по основным данным: управление изменениями.

Вам необходимо уведомить первый контекст об изменениях, которые были сохранены через второй контекст. При сохранении контекста он NSManagedObjectContextDidSaveNotification. Зарегистрируйтесь для этого уведомления. В методе-обработчике объедините в первом контексте изменения, сохраненные во втором контексте. Например:

// second managed object context save

// register for the notification
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
       selector:@selector(handleDidSaveNotification:)
           name:NSManagedObjectContextDidSaveNotification 
         object:secondManagedObjectContext];

// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
    // ...
}

// unregister from notification
[[NSNotificationCenter defaultCenter] 
    removeObserver:self 
              name:NSManagedObjectContextDidSaveNotification 
            object:secondManagedObjectContext];

Обработчик уведомлений:

- (void)handleDidSaveNotification:(NSNotification *)note {
    [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}