我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,' main'并且'支持' '主'是使用NSMainQueueConcurrencyType创建的,并且'支持'使用' NSPrivateQueueConcurrencyType'创建。此外,'支持'已被设为main的父。
我想在后备MOC上执行(可能很昂贵的)写操作,然后将这些更改(完成后)冒泡到主上下文,从而因为使用了NSFetchedResultsController而进行了UI更新。我的问题如下 - 看来在调用mergeChangesFromContextDidSaveNotification之后,主MOC上的deletedObjects属性被使用后备队列在后台操作中删除的所有对象填充。
举个例子,这里有一些代码。
[appDelegate.backingContext performBlock:^{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Parent"];
NSArray *objects = [appDelegate.backingContext executeFetchRequest:fetchRequest error:nil];
for(Parent *parent in objects) {
NSMutableOrderedSet *children = [parent mutableOrderedSetValueForKey:@"children"];
for(Child *child in children) {
[appDelegate.backingContext deleteObject:child];
}
[children removeAllObjects];
for(int i=0;i<3;i++) {
Child *child = [NSEntityDescription insertNewObjectForEntityForName:@"Child"
inManagedObjectContext:appDelegate.backingContext];
child.name = [NSString stringWithFormat:@"Child #%i", i];
[children addObject:child];
}
}
[appDelegate.backingContext save:nil];
}];
以及我的app delegate
- (void)mergeContextChanges:(NSNotification *)notification {
[self.mainContext performBlock:^{
NSLog(@"Before merge: updates - %i, inserts - %i, deletes - %i",
self.mainContext.updatedObjects.count,
self.mainContext.insertedObjects.count,
self.mainContext.deletedObjects.count);
[self.mainContext mergeChangesFromContextDidSaveNotification:notification];
NSLog(@"After merge: updates - %i, inserts - %i, deletes - %i",
self.mainContext.updatedObjects.count,
self.mainContext.insertedObjects.count,
self.mainContext.deletedObjects.count);
}];
}
以下是合并更改后日志的内容 -
2013-04-03 00:51:40.476 CoreDataTest[41617:c07] Before merge: updates - 0, inserts - 0, deletes - 0
2013-04-03 00:51:40.477 CoreDataTest[41617:c07] After merge: updates - 0, inserts - 0, deletes - 3
您将注意到主要上下文报告有3个待删除的对象。据我所知,这是不正确的 - 不应该mergeContextChanges:导致(否则完全不受影响)上下文的状态不显示挂起的更改?此方法的要点是更改已提交到持久性存储。
我在这里缺少什么?
答案 0 :(得分:2)
mergeChangesFromContextDidSaveNotification:
的文档说:
此方法刷新在其他上下文中已更新的任何对象,任何新插入的对象中的错误,并在已删除的上调用deleteObject:。
(正如我所读)与你的结果一致。
答案 1 :(得分:0)
这些对象可能在主要上下文中被删除(在删除之前)
由于mainContext父级是后备,因此您可以将这些更改提交到父上下文(在mainContext上执行保存)。
保存不应该花费很长时间,因为它没有提交到持久性存储,只能提交到父上下文
您可以将这些项目保留在主上下文中,直到它被应用程序中的另一个流程保存为止
您的UI将响应删除这些项目。