0

我的应用程序中目前有 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 中?

这就是我目前所看到的。我假设核心数据缓存是在传播存储级别完成的?如果那是正确的,那么仅在您不打算重新运行 fetch 查询的情况下才需要同步上下文,以便您可以选择性地仅更新已更改的 NSManagedObjects?

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

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

2 回答 2

1

当您使用两个不同的 NSManagedObjectContexts 时,如果您希望在 Tab B 中修改的数据显示在 Tab 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];
}
于 2012-08-18T12:13:37.347 回答
0

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

于 2012-08-19T09:28:51.803 回答