NSManagedObjectContextDidSaveNotification合并和已删除的对象

时间:2013-04-03 05:53:58

标签: ios core-data

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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

mergeChangesFromContextDidSaveNotification:的文档说:

  

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

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

答案 1 :(得分:0)

这些对象可能在主要上下文中被删除(在删除之前) 由于mainContext父级是后备,因此您可以将这些更改提交到父上下文(在mainContext上执行保存)。
保存不应该花费很长时间,因为它没有提交到持久性存储,只能提交到父上下文
您可以将这些项目保留在主上下文中,直到它被应用程序中的另一个流程保存为止 您的UI将响应删除这些项目。