Родительский/дочерний NSManagedObjectContext не работает

У меня возникли проблемы с Parent Child NSManagedObjectContext. Проблема в том, что я хочу использовать дочерний NSManagedObjectContext в своем классе EventsPlanner для создания случайного события. Если вы заметили, это работает, если вы сохраняете непосредственно в основной NSManagedObjectContext, но я хочу использовать дочерний элемент и обновить родительский.

Если вы видите, что нажатие кнопки «+» добавляет новое событие, но оно выглядит пустым.

Я добавил пример проекта --> https://dl.dropbox.com/u/63377498/ParentChildExperiment.zip

Создание дочернего NSManagedObjectContext:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [_managedObjectContext setUndoManager:nil];
    [_managedObjectContext setParentContext:appDelegate.managedObjectContext];
    return _managedObjectContext;
}

Сохранение:

Event *event = [[Event alloc] initWithEntity:self.eventEntity insertIntoManagedObjectContext:nil];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

[self.managedObjectContext insertObject:event];

[self.managedObjectContext performBlock:^{

NSError *childError = nil;
if ([self.managedObjectContext save:&childError]) {
    [self.managedObjectContext.parentContext performBlock:^{

        NSError *parentError = nil;

        if (![self.managedObjectContext.parentContext save:&parentError]) {
            NSLog(@"parent error: %@", [parentError description]);
            abort();

        }                        
    }];
} else {
    NSLog(@"child error: %@", [childError description]);
    abort();
}}];

Спасибо!


person 3lvis    schedule 15.10.2012    source источник


Ответы (1)


Я не могу назвать вам точную причину, почему это не работает, но проблема, похоже, в том, что вы создаете объект Event без контекста управляемого объекта и добавляете его в MOC позже:

// Create random object
Event *event = [[Event alloc] initWithEntity:self.eventEntity insertIntoManagedObjectContext:nil];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

// Insert object
[self.managedObjectContext insertObject:event];

Если вы измените это на

Event *event = [[Event alloc] initWithEntity:self.eventEntity
              insertIntoManagedObjectContext:self.managedObjectContext];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

то новые события правильно отображаются в виде таблицы.

person Martin R    schedule 15.10.2012
comment
Блин, реально помогло. Но, как правило, я обычно не добавляю NSManagedObject до проверки правильности всей информации внутри. Посмотрим, как пойдет. Кстати, спасибо! - person 3lvis; 15.10.2012
comment
Я думаю, что это ошибка в NSManagedObjectContext, мне нужно заполнить отчет об ошибке. Спасибо! - person 3lvis; 17.10.2012