1

根据Apple 的文档,我们有以下内容:

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

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

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

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

  • NSManagedObjectContext具有NSPrivateQueueConcurrencyType并发类型的“根” 。我使用这个 MOC 来坚持我对NSPersistentStoreCoordinator.

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

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

所以,我的问题是:

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

在此先感谢您的帮助。

4

1 回答 1

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父级异步持久保存到磁盘。

于 2013-11-19T07:43:23.853 回答