0

学习 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];

有任何想法吗?

4

1 回答 1

0

感谢您对您的问题的非常滑稽的叙述。

一个错误是指定映射/Dogowner并尝试加载/dogowner. 您上面的评论还带来了另外两个巨大的问题

  1. xml 和 json 不可互换
  2. 您的源密钥路径错误。
于 2012-08-14T13:08:45.397 回答