草庐IT

ios - NSManagedObjectContextDidSaveNotification 合并和 deletedObjects

coder 2024-01-20 原文

我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,'main' 和 'backing'。 '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];
}];

在我的应用委托(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: 导致(否则完全未触及)上下文的状态不显示挂起的更改?此方法的要点是更改已提交到持久存储。

我在这里错过了什么?

最佳答案

mergeChangesFromContextDidSaveNotification: 的文档说:

This method refreshes any objects which have been updated in the other context, faults in any newly-inserted objects, and invokes deleteObject: on those which have been deleted.

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

关于ios - NSManagedObjectContextDidSaveNotification 合并和 deletedObjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15779840/

有关ios - NSManagedObjectContextDidSaveNotification 合并和 deletedObjects的更多相关文章

随机推荐