我现在使用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以合并更新。

10-07 23:52