gpt4 book ai didi

ios - NSManagedObjectContextDidSaveNotification 合并和 deletedObjects

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:46 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com