CoreData 多 NSManagedObjectContext 保存通知说明

Posted

技术标签:

【中文标题】CoreData 多 NSManagedObjectContext 保存通知说明【英文标题】:CoreData Multiple NSManagedObjectContext Save Notification Clarification 【发布时间】:2014-05-09 08:58:25 【问题描述】:

我只是想确保我所做的是正确的!

我使用了父子 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】:

您似乎正在将通知合并到另一个子上下文。我通常会这样做,

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

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

【讨论】:

不,我不使用保存通知将更改合并到另一个子项,我只使用它来合并对父项的更改,例如,保存主上下文的子上下文将触发保存通知,那时我会合并更改到主上下文,并保存它,实习生触发父级的保存通知,那时我会将更改合并到父级私有上下文

以上是关于CoreData 多 NSManagedObjectContext 保存通知说明的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 使用 CoreData 的 dispatch_async 保留周期

删除时如何手动管理Core Data关系

CoreData多线程安全

CoreData 多对多关系

CoreData 多线程

CoreData - 一对多关系