父/子 NSManagedObjectContext 不起作用

Posted

技术标签:

【中文标题】父/子 NSManagedObjectContext 不起作用【英文标题】:Parent/Child NSManagedObjectContext not working 【发布时间】:2012-10-15 10:37:31 【问题描述】:

我在使用父子 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】:

我不能告诉你这不起作用的确切原因,但问题似乎是你在没有托管对象上下文的情况下创建了 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 = ...;

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

【讨论】:

该死,这确实有帮助。但作为一项规则,我通常不会在检查里面的所有信息是否正确之前添加 NSManagedObject。让我们看看情况如何。顺便说一句,谢谢! 我认为这是 NSManagedObjectContext 中的错误,我需要填写错误报告。谢谢!

以上是关于父/子 NSManagedObjectContext 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

父组件接收子组件事件的参数===子组件给父组件传值===子组件调用(绑定)父组件的方法

父组件调用子组件的方法

vue---父组件监听子组件并获取子组件的值(子组件多个值)

子窗口关闭,父窗口如何刷新

react 子组件调用父组件方法

【技术】Vue 父组件如何监听子组件的生命周期