CoreData Multiple NSManagedObjectContext保存通知澄清

时间:2014-05-09 08:58:26

标签: ios objective-c core-data

我只是想确保做什么是对的!

我使用了Parent-Child NSManagedObjectContext模式,其中

我有一个默认的私有队列NSManagedObjectContext ,类型为NSPrivateQueueConcurrencyType,并且

我有一个MainQueue NSManagedObjectContext ,类型为NSMainQueueConcurrencyType,其父级是默认的私有队列,

并且对于每个视图控制器,我将创建一个具有主队列上下文的父级的私有队列上下文

就是这样,

私人环境 - >     主要背景 - >         其他背景

所以我的问题是,这个设置是否需要 NSManagedObjectContextDidSaveNotification 将更改传播到父上下文,否则它将自动冒泡,因为所有其他上下文都是父和主上下文的子项

因为目前正在使用上下文保存通知来合并更改,并且很多时候会出现以下错误

致命异常:NSInternalInconsistencyException 此NSPersistentStoreCoordinator没有持久存储。它无法执行保存操作。

2  CoreData                       0x2f2f44c9 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 3228
3  CoreData                       0x2f315db1 -[NSManagedObjectContext save:] + 824
4  App                        0x000a3279 -[CoreDataManager saveContext:withCompletionBlock:] (CoreDataManager.m:144)
5  App                        0x000a31f9 __46-[CoreDataManager contextDidSaveNotification:]_block_invoke (CoreDataManager.m:134)
6  CoreData                       0x2f3798f9 developerSubmittedBlockToNSManagedObjectContextPerform_privateasync + 68

1 个答案:

答案 0 :(得分:0)

您似乎正在将通知合并到另一个子环境中。我通常如何做到这一点,

MainViewController

持久存储协调器的主要上下文 除了管理子上下文之外,没有其他任何事情。

ViewController 1

具有子托管对象上下文,其父级是主上下文 你可以保存它并将更改推送到主上下文,如此,

[chilContext performBlock:^{
  [childContext save:&error];
  if(!error){
   [childContext.parentContext performBlock:^{
     [childContext.parentContext save:&error];
   }];
  }
}];

ViewController 2

您是否会从父对象中查看NSManagedObjectContextDidSaveNotification,如果找到要保存的上下文,则会通过合并此通知中的更改来刷新对象。

- (void)parentContextSaved:(NSNotification*)note{
  if(![NSThread isMainThread]){
    [self performSelector:@selector(parentContextSaved:) onThread:[NSThread mainThread] withObject:note waitUntilDone:NO];
  }
  [childObjectContext performBlock:^{
    [childObjectContext mergeChangesFromContextDidSaveNotification:note];
   }];
}

我使用这种方法,这很有效。