【问题标题】:How do I fetch a simple json array of strings using restkit如何使用restkit获取一个简单的json字符串数组
【发布时间】:2014-01-08 17:13:59
【问题描述】:

我的问题与

重复

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

Whatever 类应该是什么?应该是 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

【问题讨论】:

    标签: ios objective-c restkit-0.20 kvc


    【解决方案1】:

    这是使用 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);
            }];
    

    【讨论】:

      【解决方案2】:

      事实证明,我在 UPDATE 部分的做法确实有效。

      RKMappingSourceObject 是一个红鲱鱼。它实现了 NSProxy,因此它的行为就像我所期望的 NSString。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 2015-04-06
        • 2018-01-07
        • 1970-01-01
        • 2014-02-26
        • 2013-06-15
        • 2011-06-25
        • 1970-01-01
        相关资源
        最近更新 更多