我现在使用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
? 最佳答案
您的上下文无关。它们都是附加到同一持久性存储协调器的根上下文。
对持久性存储的更改将自动推送到与其关联的根上下文(这就是为什么您不需要处理NSManagedObjectContextDidSaveNotification
通知的原因。)NSManagedObjectContextDidSaveNotification
在处理更复杂的上下文关系时很有用,因为中级上下文在更改后不会自动通知其所有子级。
作为示例,请查看Cadmium(https://github.com/jmfieldman/Cadmium)的体系结构图。当后台子上下文保存到writer上下文时,主上下文必须在主线程上处理NSManagedObjectContextDidSaveNotification
以合并更新。