任何人都可以解释为什么给出以下 MagicalRecord 导入代码
__block NSManagedObject *importedObject = nil;
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
id entityClass = NSClassFromString( name );
importedObject = [entityClass importFromObject:dictionary inContext:localContext];
}];
NSManagedObjectID *importedObjectID = importedObject.objectID;
NSManagedObject *relatedObject = ( (CustomRelatedExampleObject *) [[NSManagedObjectContext defaultContext] objectWithID:importedObjectID] ).relatedObject;
这工作正常,设置关系并按预期保存
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
someObjectInDefaultContext.alsoRelated = relatedObject;
}];
但这会导致 exec 访问错误,当我预计这在技术上更正确时,因为我正在使用本地上下文来保存我的数据。(注意:为简洁起见,我省略了从两个对象中获取 objectID 的代码)
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext objectWithID:someOtherObjectInDefaultContextObjectID];
CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext objectWithID:localRelatedObjectID];
localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject;
}];
当我尝试将对象分配给另一个对象中的关系时,我在最后一行获得了 exec bad access。
更新 1
此问题是由在另一个托管对象上下文中获取对象的本地副本时使用临时对象 ID 引起的。
更新 2
我发现只需更改用于检索对象的方法即可消除错误。
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext existingObjectWithID:someOtherObjectInDefaultContextObjectID];
CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext existingObjectWithID:localRelatedObjectID];
localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject;
}];
使用 existingObjectWithID 而不是 objectWithID 返回和对象具有永久 id 而不是临时的。