我读过一些文章,但仍然没有得出结论。假设我有一个嵌套的NSManagedObjectContext
喜欢
BackgroundContext -> NSPrivateQueueConcurrencyType
|
child
v
MianContext -> NSMainQueueConcurrencyType
|
child
v
TemporaryContext -> NSPrivateQueueConcurrencyType
问题1:我是否仍应观察NSManagedObjectContextObjectsDidChangeNotification
并合并以下更改:
- (void)managedObjectContextDidChanged:(NSNotification *)notification{
NSManagedObjectContext *currentContext = [notification object];
NSManagedObjectContext *mainConetext = [self mainThreadContext];
if (currentContext != mainConetext) {
[mainConetext performBlock:^{ //performBlock in notification
[mainConetext mergeChangesFromContextDidSaveNotification:notification];
}];
}
}
事实上我已经尝试删除此代码,当我对mainContext
执行提取时它表现良好,但我感到困惑的是 mainContext如何合并子上下文更改,因为我觉得我在这里做错了。
问题2:我应该使用嵌套的performBlock
合并更改吗?
[temporaryContext performBlock:^(
//do some thing
[mainContext performBlock:^(
// merge changes
)];
)];
答案 0 :(得分:3)
保存子上下文后,这些更改会自动推送到父级。正如它在docs中所说的那样,您可以将上下文堆栈视为在根目录中具有持久性存储协调器。保存的更改会提升一级:
在上下文中保存更改时,更改仅提交“一个存储”。如果保存子上下文,则更改将推送到其父级。在保存根上下文之前,更改不会保存到持久性存储中。 (根管理对象上下文是父上下文为nil的上下文。)此外,父项在保存之前不会从子项中提取更改。如果您希望最终提交更改,则必须保存子上下文。
因此,如果您保存子上下文,那些更改将被推送到父级 - 但除非保存根上下文,否则不会将其写入磁盘,这可以按照不同的计划进行。
在此结构下,不需要合并更改和观察保存。这是它的众多优势之一。