我是否仍需要在使用子父NSManagedObjectContext的应用程序中使用mergeChangesFromContextDidSaveNotification

时间:2013-11-14 10:35:00

标签: ios core-data concurrency nsmanagedobjectcontext nsoperationqueue

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

  

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

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

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

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

  • 具有NSManagedObjectContext并发类型的“root”NSPrivateQueueConcurrencyType。我使用此MOC将我的更改保留到NSPersistentStoreCoordinator

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

  • 具有NSManagedObjectContext并发类型的“本地”NSPrivateQueueConcurrencyType。我在创建批次的新帖子对象时使用此MOC。

所以,我的问题是:

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

1 个答案:

答案 0 :(得分:0)

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

[_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父级会将其更改异步保存到磁盘。