我现在正在使用Core Data一段时间使用背景上下文,并且想知道为什么每个人都建议使用NSManagedObjectContextDidSaveNotification
从背景到主要上下文的合并。我用一个NSPersistentStoreCoordinator
,一个主要上下文和一个背景上下文创建了一个Test-Project。以下是初始化的代码片段:
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectContext *)backgroundContext {
if (_backgroundContext != nil) {
return _backgroundContext;
}
_backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_backgroundContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
return _backgroundContext;
}
直到现在,我会听到这样的保存通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:self.backgroundContext];
但我意识到,如果我从该通知中合并并不重要。我可以编辑并保存任何一个上下文,另一个可以在几秒钟之后合并。
因此。我的问题,为什么我甚至需要NSManagedObjectContextDidSaveNotification
?
答案 0 :(得分:1)
你的背景与此无关。它们都是附加到同一持久性存储协调器的根上下文。
对持久性存储的更改会自动推送到与之关联的根上下文(这就是您不需要处理NSManagedObjectContextDidSaveNotification
通知的原因。)
NSManagedObjectContextDidSaveNotification
在处理更复杂的上下文祖先时非常有用,因为中级上下文在更改时不会自动通知其所有子项。
作为示例,请查看Cadmium(https://github.com/jmfieldman/Cadmium)的体系结构图。当后台子上下文保存到编写器上下文时,主上下文必须处理主线程上的NSManagedObjectContextDidSaveNotification
以包含更新。