使用多个CoreData NSManagedObjectContexts时是否需要实现NSManagedObjectContext Notifications?

时间:2012-08-18 11:41:28

标签: iphone ios caching core-data concurrency

我目前在我的应用中有2个上下文。我的应用程序使用多个选项卡,因此一个选项卡可以显示数据,而另一个选项卡可能处于数据输入模式。

我使用一个主要上下文来读取大部分数据以供显示。当我插入数据时,我正在使用第二个临时上下文,因为我不希望其他选项卡的操作保存可能不完整的对象添加到上下文中。

我一直在阅读苹果并发指南: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1

它表示您应该使用通知在上下文之间传播更改。

我的两个上下文都使用相同的传播存储对象。我的问题是,如果在选项卡A中对上下文A进行了更改,当使用上下文B在选项卡B中重新发出获取请求时,更改是否会显示在选项卡B中?

这就是我目前所看到的。我假设核心数据缓存是在传播商店级别完成的?如果这是正确的,那么只有在您不打算重新运行获取查询时才需要同步上下文,这样您才能有选择地仅更新已更改的NSManagedObjects?

这就是我获取新背景的方式:

   NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    NSManagedObjectContext *newContext;
    if (coordinator != nil) {
        newContext = [[NSManagedObjectContext alloc] init];
        [newContext setPersistentStoreCoordinator:coordinator];
    }

2 个答案:

答案 0 :(得分:1)

如果您希望在使用两个不同的NSManagedObjectContexts时,在选项卡B中修改的数据显示在选项卡A中(反之亦然),则需要在通知中添加观察者

NSManagedObjectContextDidSaveNotification

选项卡A的控制器代码中的

(如果在A中进行了更改,则为B)

,如

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:nil];

然后在声明的选择器

-(void)mergeChanges:(NSNotification *)anotif
{
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:anotif];
    [self updateTheUI];
}

答案 1 :(得分:0)

“您在一个上下文中对托管对象所做的更改不会传播到另一个上下文中的相应托管对象,除非您重新获取或重新验证该对象。”