RestKit - 从索引端点映射资源集合

时间:2015-01-08 16:55:16

标签: ios objective-c restkit restkit-0.20

我在当前项目中使用RestKit来促进与定制REST API的通信。我在从索引端点检索资源集合时遇到了问题。我能够检索资源,但是我无法将它们映射到目标类。

以下是详细信息(我已经替换了相关实际业务对象的小部件)。

端点是GET / api / v1 / widgets。从端点返回的JSON如下所示:

{"widgets": [
  {
    "widgets": {
      "name": "whatsit",
      "material": "wood",
      "crafted_by": "Hrunkner"
    }
  },
  {
    "widgets": {
      "name": "doodad",
      "material": "carbon fiber",
      "crafted_by": "Zaphod"
    }
  }
]}

我知道上面的JSON结构对于每个资源的根节点名称都是特殊的,但是目前这是我无法控制的。

我在WidgetManager类中使用以下代码来执行请求:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

// apiBaseURL equals @"http://localhost:3000/api/v1/"
NSURL *apiBaseURL = [NSURL URLWithString:appDelegate.apiBaseURL]; 
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:apiBaseURL];

NSString *itemsPath = @"widgets";
NSString *keyPath = @"widgets.widgets";
NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

RKObjectMapping *requestMapping = [[Widget widgetMapping] inverseMapping];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping: requestMapping
                                                                               objectClass:[Widget class]
                                                                               rootKeyPath:keyPath
                                                                                    method:RKRequestMethodGET];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:requestMapping
                                                                                        method:RKRequestMethodGET
                                                                                   pathPattern:nil
                                                                                       keyPath:keyPath
                                                                                   statusCodes:statusCodeSet];
[manager addRequestDescriptor: requestDescriptor];
[manager addResponseDescriptor:responseDescriptor];

[manager getObjectsAtPath:@"widgets"
               parameters:@{}
                  success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                      [appDelegate setWidgets:[mappingResult array]];
                  } failure:^(RKObjectRequestOperation *operation, NSError *error) {
                      NSLog(@"FAIL");
                  }];

我的[Widget mapping]方法如下所示:

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Widget class]];
[mapping addAttributeMappingsFromDictionary:@{
                                              @"name": @"name",
                                              @"material": @"material",
                                              @"crafted_by": @"craftedBy"
                                              }];
return mapping;

在我看来,使用inverseMapping是一个问题,但是当我尝试使用[Widget widgetMapping]而不是[[Widget widgetMapping] inverseMapping]作为请求映射时,我收到以下错误

  

必须使用映射来初始化RKRequestDescriptor对象   目标类是NSMutableDictionary,得到了Widget(参见   [RKObjectMapping requestMapping])

我在这里做错了什么?我应该如何正确配置我的请求以将每个返回的对象映射到Widget类?

对我的问题中的任何遗漏或错误表示感谢和道歉。

1 个答案:

答案 0 :(得分:0)

事实证明,仅使用逆映射响应描述符允许对象映射成功进行。以前我试图对请求和响应描述符使用相同的映射,这将不起作用。因此,将requestMapping的赋值更改为简单[Widget requestmapping],然后将[requestMapping inverseMapping]传递给请求描述符init解决了我的问题。当然,这将需要重命名局部变量requestMapping,因为它实际上对请求描述符没有用。

以下问题的答案为澄清请求与响应描述符中的映射功能提供了正确的方向:https://stackoverflow.com/a/23217042/757806