我有一个具有两个托管对象上下文设置的应用程序,如下所示:
- 父上下文: NSPrivateQueueConcurrencyType,链接到持久存储。
- 主上下文:NSMainQueueConcurrencyType,父上下文的子级。
将新的托管对象插入主上下文时,我保存主上下文,然后保存父上下文,如下所示:
[context performBlockAndWait:^{
NSError * error = nil;
if (![context save: &error]) {
NSLog(@"Core Data save error %@, %@", error, [error userInfo]);
}
}];
[parentContext performBlock:^{
NSError *error = nil;
BOOL result = [parentContext save: &error];
if ( ! result ) {
NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] );
}
}];
我的理解是,首次创建管理对象时,它有一个临时的objectID
. 然后保存主上下文,该对象及其临时 ID 进入父上下文。然后保存父上下文。保存最后一个上下文objectID
时,父上下文中的临时变量将转换为永久变量objectID
。
所以:
- 永久对象 ID 是否会自动传播回主(子)上下文?
- 当我强制使用 获取对象永久 ID
[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
,然后后台应用程序,重新激活它,重新加载,使用主上下文获取对象objectWithID:
并访问属性时,我得到“CoreData 无法为 ...”完成故障。