RestKit Router - 如何使用嵌套变量实现路由?

时间:2014-01-14 15:28:11

标签: ios objective-c restkit restkit-0.20 rkobjectmapping

过去我为每个RKResponseDescriptor以及每个RKObjectManager get / post / patch / delete方法指定了路径参数。这很有效,但似乎RKRouter是更好,更模块化的方法。

我在设置包含嵌套变量的动态路由时遇到问题。例如:

添加路线

RKRoute *locationsRoute = [RKRoute routeWithClass:[Location class]     pathPattern:@"users/:userID/locations/:locationID" method:RKRequestMethodAny];
[[RKObjectManager sharedManager].router.routeSet addRoutes:@[locationsRoute]];

设置响应描述符

 RKResponseDescriptor *locationResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:locationResponseMapping
                                                                                          method:RKRequestMethodAny
                                                                                     pathPattern:nil
                                                                                         keyPath:nil
                                                                                     statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

进行对象管理员调用

[[RKObjectManager sharedManager] getObject:[Location class] path:nil parameters:nil success:nil failure:nil];

在使用路由器之前,我会在对象管理器调用路径中包含userID。 (如:path:[NSString stringWithFormat:@"users/%@/locations/%@", [self getCurrentUser].userID, location.locationID])。但是,在使用路由器时,我似乎无法弄清楚如何指定它。 这样做的正确方法是什么?我希望用户ID不必硬编码到路径路径中。

重要的是要注意我的所有映射都已正确设置,在尝试实现路由之前一切都运行良好。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

你的路线很好,这是错的:

[[RKObjectManager sharedManager] getObject:[Location class] ...

因为您需要传递Location类的实例(而不是类对象),并且该实例需要设置userIDlocationID属性,以便可以将它们注入路径路径模式。

答案 1 :(得分:0)

记住Wain的回答,我最终需要为一个对象提供多条不同的路线;其索引是基于关系的路线。例如:

<强>索引

RKRoute *locationIndexRoute = [RKRoute routeWithRelationshipName:@"locations" objectClass:[User class] pathPattern:@"users/:userID/locations" method:RKRequestMethodGET];

[[RKObjectManager sharedManager] getObjectsAtPathForRelationship:@"locations" ofObject:[self getCurrentUser] parameters:nil success:nil failure:nil];

<强>更新

RKRoute *locationUpdateRoute = [RKRoute routeWithClass:[Location class] pathPattern:@"users/:userID/locations/:locationID" method:RKRequestMethodPATCH];

[[RKObjectManager sharedManager] patchObject:location path:nil parameters:nil success:nil failure:nil];