我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,“主要”和“支持”。'Main' 使用 NSMainQueueConcurrencyType 创建,'backing' 使用 'NSPrivateQueueConcurrencyType' 创建。此外,'backing' 已被设置为 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];
}];
在我的应用委托上
- (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: 导致(否则完全未触及)上下文的状态不显示挂起的更改吗?此方法的要点是更改已提交到持久存储。
我在这里想念什么?