CoreData多NSManagedObjectContext保存通知说明

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

我已经使用了父 - 子NSManagedObjectContext模式,其中

我有一个类型为NSPrivateQueueConcurrencyType的默认专用队列NSManagedObjectContext ,和

我有一个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

好像你正在将通知合并到另一个子上下文中。 我通常会这样做的是,

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];
   }];
}

我使用这种方法,这很好。

链接地址: http://www.djcxy.com/p/91657.html

上一篇: CoreData Multiple NSManagedObjectContext Save Notification Clarification

下一篇: How to have different NSManagedObjectContexts?