【问题标题】:Do I need to implement NSManagedObjectContext Notifications when using multiple CoreData NSManagedObjectContexts?使用多个 CoreData NSManagedObjectContexts 时是否需要实现 NSManagedObjectContext 通知?
【发布时间】:2012-08-14 15:18:28
【问题描述】:

我的应用中目前有 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];
    }

【问题讨论】:

    标签: iphone ios caching core-data concurrency


    【解决方案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];
    }
    

    【讨论】:

    • 在选项卡 B 中,如果我只是重新发出包含来自选项卡 A 的对象的提取请求,我会看到新数据。这就是为什么我想知道苹果建议是否仅在您想有选择地更新已经在您的上下文中的现有 NSManagedObjects 时,因为它看起来像一个提取请求重新加载它们。我只是想确定这是行为。
    • 如果您使用的是 NSFetchedResultsController,我认为上面的代码会自动为您完成。否则,您不应该在上下文 B 中看到上下文 A 的变化,直到您像上面那样明确合并。你真的有 2 个独特的 MOC 对象吗?
    • 我没有使用 NSFetchedResultsController 我编辑了代码帖子以显示我如何实例化新上下文。所有上下文都使用相同的持久存储协调器对象。
    • 啊哈! “您在一个上下文中对托管对象所做的更改不会传播到不同上下文中的相应托管对象,除非您重新获取或重新故障该对象。”一定是跳过了那一点,和我想的完全一样,谢谢你的帮助。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2012-01-22
      • 2012-01-06
      相关资源
      最近更新 更多