根据Apple's doc,我们有以下内容:
在上下文中保存更改时,更改仅提交“一个存储”。如果保存子上下文,则更改将推送到其父级。在保存根上下文之前,更改不会保存到持久性存储中。 (根管理对象上下文是父上下文为nil的上下文。)此外,父项在保存之前不会从子项中提取更改。如果您希望最终提交更改,则必须保存子上下文。
我的数据模型大致由以下NSManagedObject
层次结构组成:
Category <---->> Feed <---->> Post
我的应用程序RSS阅读器使用以下内容:
具有NSManagedObjectContext
并发类型的“root”NSPrivateQueueConcurrencyType
。我使用此MOC将我的更改保留到NSPersistentStoreCoordinator
。
具有NSManagedObjectContext
并发类型的“main”NSMainQueueConcurrencyType
。我使用这个MOC来提供我的GUI。
具有NSManagedObjectContext
并发类型的“本地”NSPrivateQueueConcurrencyType
。我在创建批次的新帖子对象时使用此MOC。
所以,我的问题是:
localMOC
时,它会自动传播到我的mainMOC
吗?或者我是否仍需要观察NSManagedObjectContextDidSaveNotification
中的localMOC
并手动将两个MOC与mergeChangesFromContextDidSaveNotification
合并? DBOperation <NSOperation>
上下文中,该上下文已发送到NSOperationQueue
,如何在此处进行同步?我是否必须将mainMOC
作为参数传递给DBOperation
才能将其用作每个localMOC
的父级?MainViewController
,但我不确定这是个好主意。我应该像以前一样坚持NSOperationQueue
,还是当前的[localMOC performBlock:^{ ... }];
结构能为我提供合适的后台处理?提前感谢您的帮助。
答案 0 :(得分:0)
我终于通过实施自己的保存程序解决了我的问题:
[_localMOC performBlockAndWait:^{
NSError *errLoc=nil;
if (![self.mainMOC obtainPermanentIDsForObjects:@[[[_mainMOC insertedObjects] arrayByAddingObjectsFromArray:[_mainMOC updatedObjects]]] error:&errLoc]) {
NSLog(@" ... ");
}
if (![_localMOC save:&errLoc]) {
NSLog(@" ... ");
}
[_mainMOC performBlockAndWait:^{
NSError *errMain=nil;
if (![_mainMOC save:&errMain]) {
NSLog(@" ... ");
}
}]
}];
请注意,_mainMOC
正在观察AppDelegate
,并且_saveMOC
父级会将其更改异步保存到磁盘。