如何使用restkit获取简单的json字符串数组

时间:2014-01-08 17:14:00

标签: ios objective-c restkit-0.20 kvc

我的问题是

的副本

RestKit: how to fetch a simple JSON array of strings?

然而,虽然原作者发现答案有帮助,但我仍然输了。这个问题有两个单独的引用,这些引用都不足以帮助我(KVCRestKit的完整初学者)。

一个引用是here,并提供此示例代码

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Whatever class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"someAttribute"]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:nil];

什么课程应该是什么?应该是NSString吗?或者这是否意味着我应该创建一个包装类,它具有一个NSArray *?

属性

什么是@“someAttribute”应该是什么?再次,这是否意味着一个包装类,在这种情况下,someAttribute将是我的包装类上属性的名称,它是NSArray *?

另一个引用是here,虽然它显示从数组中取出到“包装类”,但包装类只有一个NSNumber,而不是一个数组。因此,不清楚如何将该示例转换为适用于获取整个数组的示例。

作为参考,服务器返回一个字符串数组,就像原始问题一样:[“string1”,“string2”,“string3”]。

更新

这是我尝试过的代码。我已经创建了一个包装类。

@interface CannedResponse : NSObject

@property (strong, nonatomic) NSString * response;

@end

以下是映射:

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[CannedResponse class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"response"]];
[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodGET pathPattern:RESPONSES_API_PATH keyPath:nil statusCodes:nil;

我正在呼叫getObjectsAtPathForRouteName

我得到的是CannedReponses数组,如预期的那样。但是,而不是将NSString放入响应属性。我得到了RKMappingSourceObject。现在RKMappingSourceObject确实包含正确的字符串。

我将查看控制台中的RestKit日志记录,看看是否可以收集更多线索。

更新#2

正如blakewatters所提到的here我在这个例子中没有做任何映射,只能绕过RestKit的使用。问题是我在服务层编写的所有代码都使用RestKit,我盲目地遵循所有调用的模式。对于此次通话,正确的答案可能是找出如何直接访问AFNetworking

2 个答案:

答案 0 :(得分:6)

使用blakewatters here

的另一条评论,这是一个更好的答案

请勿将RestKit用于此类请求。使用AFNetworking来完成它。您可以像这样访问AFHTTPClient

[RKObjectManager sharedManager].HTTPClient

然后代码看起来像这样

AFHTTPClient * client = [RKObjectManager sharedManager].HTTPClient;
[client getPath:YOUR_PATH
     parameters:nil
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
            success([NSArray arrayWithArray:responseObject]);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            failure(operation.response.statusCode);
        }];

答案 1 :(得分:0)

事实证明,我在UPDATE部分执行此操作的方式确实有效。

RKMappingSourceObject是一个红鲱鱼。它实现了NSProxy,因此它就像我期待的NSString一样。

我猜测幕后发生的事情:RestKit创建RKMappingSourceObject实例,因为它反序列化。当它意识到我拥有的这些对象是原始的并且没有映射到任何东西时它只是将它们留在映射对象中,但是由于它实现了NSProxy,它可以将任何请求转发到底层字符串。