2

我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,“主要”和“支持”。'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: 导致(否则完全未触及)上下文的状态不显示挂起的更改吗?此方法的要点是更改已提交到持久存储。

我在这里想念什么?

4

2 回答 2

2

的文档mergeChangesFromContextDidSaveNotification:说:

此方法刷新已在其他上下文中更新的任何对象,任何新插入的对象中的故障,并在已删除的对象上调用 deleteObject :。

这(正如我所读)与您的结果一致。

于 2013-04-03T14:47:23.123 回答
0

这些对象可能是在主上下文中获取的(在它们删除之前)。
由于您的 mainContext 父级是支持,您可以将这些更改提交到父级上下文(在 mainContext 上执行保存)。
保存不应该花费很长时间,因为它没有提交到持久存储,只提交到父上下文。

您可以将这些项目保留在主上下文中,直到它被应用程序中的另一个流保存。
您的 UI 将响应这些项目的删除。

于 2013-04-03T06:31:30.843 回答