学习 RESTKit。
第 1 步:我已成功运行 Twitter 示例项目。
第 2 步:我已成功修改 Twitter 项目以指向我自己的 REST Web 服务... REST 能够成功解释结果,并将它们映射到我构建的自定义对象。
第 3 步:我创建了自己的项目空间,并将第 2 步中的工作代码复制粘贴到该项目中,并进行了一些小的编辑,但奇怪的是,RESTKit 无法正确映射结果。在这一点上我快疯了。
打开 RESTKit 中包含的方便的调试跟踪,两个项目都到了这里:
2012-08-12 21:06:14.145 RKTwitter[9087:13003] D restkit.object_mapping:RKObjectMapper.m:320 Performing object mapping sourceObject
但是 Step2 Project 将其作为下一条消息:
2012-08-12 21:06:14.294 RKTwitter[9087:13003] T restkit.object_mapping:RKObjectMapper.m:278 Examining keyPath '' for mappable content...
2012-08-12 21:06:14.301 RKTwitter[9087:13003] D restkit.object_mapping:RKObjectMapper.m:261 Found mappable collection at keyPath ''...
而我的 Step3 项目放弃并死亡:
2012-08-12 21:10:40.912 DogPark[9127:13203] D restkit.object_mapping:RKObjectMapper.m:351 The following operations are in the queue: ()
卷起袖子,我已经确定了 RESTKit 中代码执行差异的确切点:
在RKObjectMappingProvider.m
中,第 160 行是以下方法:
- (id)valueForContext:(RKObjectMappingProviderContext)context {
NSNumber *contextNumber = [NSNumber numberWithInteger:context];
return [mappingContexts objectForKey:contextNumber];
}
其中 Step2 返回一个包含 1 个元素的字典,而我的 Step3 项目返回一个包含 0 个元素的字典。该字典用于RKObjectMapper.m
第 332 行,其中 foundMappable 对于 Step2 项目为 true,对于我的 Step3 为 false。
if ([mappingsForContext isKindOfClass:[NSDictionary class]]) {
results = [self performKeyPathMappingUsingMappingDictionary:mappingsForContext];
foundMappable = (results != nil);
这是看起来正确但似乎不想正常运行的代码:
// init the Object Manager
RKURL *baseURL = [RKURL URLWithBaseURLString:SERVER_ADDRESS];
RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];
objectManager.client.baseURL = baseURL;
// Mapping
RKObjectMapping *ownerMapping = [RKObjectMapping mappingForClass: [DogOwner class]];
[ownerMapping mapKeyPath:@"DogOwnerId" toAttribute:@"dogOwnerID"];
[ownerMapping mapKeyPath:@"DogName" toAttribute:@"dogName"];
[ownerMapping mapKeyPath:@"OwnerFirstName" toAttribute:@"ownerFirstName"];
[[RKObjectManager sharedManager].mappingProvider setObjectMapping:ownerMapping forResourcePathPattern:@"/DogOwner"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath: @"/dogowner" delegate:self];
有任何想法吗?