RestKit系列 - 正确的关键路径?

时间:2018-03-09 03:04:24

标签: ios objective-c restkit restkit-0.20

我的服务器有以下JSON ......

{"Devices": [
  {
    "uuid": "d9084134-d5f7-43a3-9613-7faa769a822a",
    "label": "",
    "location": "a13d45f4-5ce0-48e3-bc3f-4076bb007037",
    "capability": 0
  },
  {
    "uuid": "a4ee0d3f-4a6a-4c61-81bd-3dfa9ab19e85",
    "label": "",
    "location": "a13d45f4-5ce0-48e3-bc3f-4076bb007037",
    "capability": 3
  }
]}

我正在尝试正确地映射这个但我正在努力...我有以下映射设置...

RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Device" inManagedObjectStore:managedObjectStore];

    [entityMapping setIdentificationAttributes:[NSArray arrayWithObject:@"uuid"]];

    [entityMapping addAttributeMappingsFromDictionary:@{
                                                        @"uuid":                        @"uuid",
                                                        @"label":                       @"label",
                                                        @"location":                    @"location",
                                                        @"capability":                  @"capability"
                                                        }];

    // GET

    RKRequestDescriptor *getRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[entityMapping inverseMapping] objectClass:[Device class] rootKeyPath:@"Device" method:RKRequestMethodGET];
    [[RKObjectManager sharedManager] addRequestDescriptor:getRequestDescriptor];

    [[RKObjectManager sharedManager].router.routeSet addRoute:[RKRoute routeWithClass:[Device class] pathPattern:@"Devices" method:RKRequestMethodGET]];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:@"Devices" keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    [[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

我将keyPath设置为“设备”,我认为这些设备可以正常工作。但是RestKit并没有理解它。

我正在使用以下内容从我的服务器获取对象...

[[RKObjectManager sharedManager] getObjectsAtPath:@"Devices" parameters:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d", clientID], @"clientId", @"topic", @"forTopic", nil] success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    ...
}... // Abbreviated for brevity.

所以我相信我的路径“Devices”对于“Devices”的pathPattern是正确的。这些参数搞砸了吗?我以前有过参数,而且无需在映射中指定任何内容,它始终有效。

我目前正在使用RestKit 0.27.1。

更新 - 修正了JSON

我修改了Mahendra GP提到的JSON。所以现在这是一个合适的数组。 RestKit日志现在显示跟踪日志中的JSON。但是它仍然无法识别它是哪个对象(设备)。

日志片段......

...and targetObject: (null)
2018-03-09 02:44:05.603734-0700 MyTestApp[31576:6868006] D restkit.object_mapping:RKMapperOperation.m:440 Finished performing object mapping. Results: (null)
2018-03-09 02:44:05.605334-0700 MyTestApp[31576:6868006] E restkit.network:RKObjectRequestOperation.m:172 GET 'http://[MY_IP]:8080/Devices?clientId=5199&forTopic=topic' (200 OK / 0 objects) [request=2.6488s mapping=0.0000s total=2.6633s]: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No response descriptors match the response loaded." 

1 个答案:

答案 0 :(得分:0)

我终于通过fluke试错找出了我的问题。我无法在RestKit的网站上找到任何关于SO或以上的特定帖子。因此,我想我会在这里发布解决问题的简单解决方案。

我不断收到错误,我的任何响应描述符都没有与任何关键路径匹配。我认为这与我传递给GET的参数有关,因为它会在错误中尝试将其与设置响应描述符的设备路径进行比较。然而事实证明这根本不是问题。

问题在于我的RKResponseDescriptor设置。我本来有......

  RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:@"Devices" keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

此处的解决方案是" pathPattern "。这需要设置为 nil

我已经使用RestKit多年了。在0.2x版本发布之前。我记得有些事情是关于RestKit能够识别一个实体,而它只是通过多元化来实现它的多重性。我终于想到,也许是因为我在pathPattern中指定它导致了这个问题。所以,一旦我最终确定它为零,它终于开始工作了。我实际上认为原因是将它设置为nil就像将它设置为任何pathPattern的通配符,因为我的路径实际上已经将参数标记到它们上面。

然而在另一个用例中,我确实指定了pathPattern,但它不是映射实体的复数,而是它的不同之处。所以我没有使用DeviceForUser这样的设备。因此,在pathPattern中指定实体的复数时似乎存在问题。特别是如果在getObjectsAtPath调用中使用参数。

为清楚起见,上面的所有代码都是相同的。它只需要这种改变......

  RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodGET pathPattern:nil keyPath:@"Devices" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

我希望这可以帮助其他可能遇到此问题的人。