我只是想确保做什么是对的!
我使用了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
答案 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];
}];
}
我使用这种方法,这很有效。