NSManagedObjectContextDidSaveNotification没用?

时间:2016-06-02 01:54:58

标签: ios objective-c core-data

我现在正在使用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

1 个答案:

答案 0 :(得分:1)

你的背景与此无关。它们都是附加到同一持久性存储协调器的根上下文。

对持久性存储的更改会自动推送到与之关联的根上下文(这就是您不需要处理NSManagedObjectContextDidSaveNotification通知的原因。)

NSManagedObjectContextDidSaveNotification在处理更复杂的上下文祖先时非常有用,因为中级上下文在更改时不会自动通知其所有子项。

作为示例,请查看Cadmium(https://github.com/jmfieldman/Cadmium)的体系结构图。当后台子上下文保存到编写器上下文时,主上下文必须处理主线程上的NSManagedObjectContextDidSaveNotification以包含更新。