- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,'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/
我想删除核心数据表(DatiGame)中的所有行,该表由 4 个字段组成。foto_bottone0foto_bottone1照片大师文托并且该表没有其他关系。 但是 DeletedObjects 操
我有一个有趣的问题,我似乎无法找到解决方案 - 我有两个托管对象上下文,'main' 和 'backing'。 'Main' 使用 NSMainQueueConcurrencyType 创建,'bac
我是一名优秀的程序员,十分优秀!