父/子NSManagedObjectContext无法正常工作

时间:2012-10-15 10:37:31

标签: ios iphone core-data nsmanagedobjectcontext

我在使用Parent Child NSManagedObjectContext时遇到了一些麻烦。 问题是我想在EventsPlanner类中使用子NSManagedObjectContext来创建随机事件。如果您注意到它直接保存到主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();
}}];

谢谢!

1 个答案:

答案 0 :(得分: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 = ...;

然后在表格视图中正确显示新事件。

相关问题