【问题标题】:Do I still need to use mergeChangesFromContextDidSaveNotification in an App that use child-parent NSManagedObjectContext我是否还需要在使用子父 NSManagedObjectContext 的应用程序中使用 mergeChangesFromContextDidSaveNotification
【发布时间】:2013-11-27 07:54:52
【问题描述】:

根据Apple's doc,我们有以下内容:

当您在上下文中保存更改时,更改只会“一次存储”提交。如果您保存子上下文,则会将更改推送到其父上下文。在保存根上下文之前,更改不会保存到持久存储中。 (根托管对象上下文是其父上下文为 nil 的上下文。)此外,父级在保存之前不会从子级拉取更改。如果您想最终提交更改,则必须保存子上下文。

我的数据模型大致由以下NSManagedObject层次结构组成:

Category <---->> Feed <---->> Post

我的应用程序,一个 RSS 阅读器,使用以下内容:

  • 具有NSPrivateQueueConcurrencyType 并发类型的“根”NSManagedObjectContext。我使用此 MOC 将我的更改持久化到 NSPersistentStoreCoordinator。

  • 具有NSMainQueueConcurrencyType 并发类型的“主”NSManagedObjectContext。我使用这个 MOC 来提供我的 GUI。

  • 具有NSPrivateQueueConcurrencyType 并发类型的“本地”NSManagedObjectContext。我在创建一批新的 Posts 对象时使用这个 MOC。

所以,我的问题是:

  1. 当我保存我的localMOC 时,它会自动传播到我的mainMOC 吗?还是我仍然需要从localMOC 观察NSManagedObjectContextDidSaveNotification 并手动将两个MOC 与mergeChangesFromContextDidSaveNotification 合并?
  2. 直到昨天,批量导入是在发送到NSOperationQueue 的外部DBOperation &lt;NSOperation&gt; 上下文中进行的,这里如何进行同步?我是否必须将 mainMOC 作为参数传递给 DBOperation 才能将其用作每个 localMOC 的父级?
  3. 我将批处理例程放回我的MainViewController,但我不确定这是一个好主意。我应该像以前一样坚持NSOperationQueue 还是当前的[localMOC performBlock:^{ ... }]; 结构为我提供不错的后台处理?

提前感谢您的帮助。

【问题讨论】:

  • “根”、“主”和“本地”之间的关系是什么。大概“main”和“local”都有“root”作为它们的父级?
  • 另外,这是一本好书:cocoanetics.com/2012/07/multi-context-coredata
  • 嘿 Mike,我读了那篇文章,它的“异步保存”段落启发了我:root 是 main 的父级,而 main 是 local 的父级。在本文中,root 将是 writerMOC。我只是不确定如何在我的应用中部署这些。

标签: ios core-data concurrency nsmanagedobjectcontext nsoperationqueue


【解决方案1】:

我终于通过实现自己的保存程序解决了我的问题:

[_localMOC performBlockAndWait:^{
    NSError *errLoc=nil;

    if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects]     arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) {
    NSLog(@" ... ");
    }

    if (![_localMOC save:&errLoc]) {
      NSLog(@" ... ");
    }
    [_mainMOC performBlockAndWait:^{
        NSError *errMain=nil;
        if (![_mainMOC save:&errMain]) {
            NSLog(@" ... ");
        }
    }]
}];

请注意,_mainMOC 是从 AppDelegate 观察到的,并且其更改将由其 _saveMOC 父级异步保存到磁盘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2016-05-08
    • 2016-05-12
    相关资源
    最近更新 更多