我目前正在开发一个使用Rest API的应用程序,我正在混合使用EntityMapping和ObjectMapping,因为有些静态数据我更喜欢保存在本地存储中而不是其他“实时”数据。我不想打扰。
我会尽可能地总结一下。所以我使用以下类和映射执行标准getObjectsAtPath
(我将删除额外的不需要的东西):
PKNewsLocale.h
@interface PKNewsLocale : NSObject
@property (strong, nonatomic) NSNumber *identifier;
// PKLanguage is a NSManagedObject kept in Core Data SQLite
@property (strong, nonatomic) PKLanguage *language;
@end
PKLanguage.h
@interface PKLanguage : NSManagedObject
@property (nonatomic, retain) NSString * code;
@property (nonatomic, retain) NSNumber * identifier;
// Other bunch of properties
@end
Rest API JSON响应
{
id: 2,
language: 2
}
以及地图部分
RKObjectMapping *getNewsLocaleMapping = [RKObjectMapping mappingForClass:[PKNewsLocale class]];
[getNewsLocaleMapping addAttributeMappingsFromDictionary:@{
@"id" : @"identifier",
}];
RKEntityMapping *language = [RKEntityMapping mappingForEntityForName:@"language" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
language.identificationAttributes = @[@"identifier"];
[language addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"identifier"]];
[getNewsLocaleMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"language" toKeyPath:@"language" withMapping:language]];
这一切都按预期工作。我已经覆盖了PKNewsLocale的setLanguage
函数和从CoreData DB获取的语言(通过标识符)并且已正确加载。
问题是,当我到达我的ViewController并尝试访问该对象时,语言实体变成了一个错误(我已经实现了willTurnIntoFault,并且看到它已经完成了)并且数据永远不会被取回,导致错误的PKLanguage实体,其中所有属性都是零。
我有什么遗失的吗?我读到故障托管对象的每个地方都是当我们访问它的任何属性时,它应该回到已实现状态......但似乎并非如此。
修改
在Wain的帮助下挖掘并完成。我已经能够通过继承RKManagedObjectRequestOperation并在成功时添加以下行来解决问题:
[wkSelf.managedObjectContext processPendingChanges];
_并在创建块之前捕获自身上的弱指针。现在我觉得这是RestKit方面的问题,我会在他们的Github上发布一个问题。