最佳 RestKit 设置
Posted
技术标签:
【中文标题】最佳 RestKit 设置【英文标题】:Best RestKit setup 【发布时间】:2013-12-05 13:32:47 【问题描述】:我想在我的应用程序上使用 RestKit 0.20,但我对这些部分如何组合在一起有点困惑。我的每个视图控制器都需要从服务器获取数据,每个控制器在服务器上都有自己的路由返回不同的对象。我想让所有服务器请求远离视图控制器,这样我就可以集中管理它们(但如果有意义的话,可以打开另一个设置)。现在我有以下设置,但我很确定使用 RKObjectManager 和 RKRouter 有更好的方法:
1) 每个视图控制器都会触发网关对象中专用的方法。
2) 该方法将创建一个请求和一个响应映射。然后是请求和响应描述,最后是使用手动创建的 NSURL 的请求操作。
3) 在成功块中,我使用 NSnotification 将响应传递给视图控制器。
有更好的设置吗?我可以只对所有请求使用一个 RKObjectManager 吗?这是如何运作的?我是否将其放在网关中的单独方法中?有没有比 NSNotification 更好的方法来返回我的视图控制器?
对不起,如果其中一些是非常基本的。
【问题讨论】:
【参考方案1】:我建议采用以下结构(以 Instagram 为例):
1) 首先根据您使用的“资源”拆分您的所有请求,例如用户/评论/喜欢等
2) 为每个“资源”创建一个单独的类,RKObjectManager 的子类,例如 UsersManager、CommentsManager、LikesManager(均继承自 RKObjectManager)
3) 在每个管理器上定义额外的方法,您将在视图控制器中使用这些方法。 例如,要为用户加载“点赞”资源,您需要在 LikesManager(或 UserManager)中定义此方法——这是一个非常自以为是的决定,这完全取决于您。
- (void)loadLikesForUser:(User *)user
success:(void (^)(NSArray *likes))successCallback
failure:(void (^)(NSError *error))failureCallback;
4) 实现此方法并使用 self 调用适当的方法,因为您已经创建了 RKObjectManager 类的子类并且可以访问所有基本方法。
[self getObjectsAtPath:@"/resources/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) // pass mappingResult.array to the successCallback failure:^(RKObjectRequestOperation *operation, NSError *error) // pass error object to the failureCallback ];
5) 在您的视图控制器中,您可以这样称呼
[[LikesManager sharedManager] loadLikesForUser:user success:^(NSArray *likes)
self.likes = likes;
// work with likes
failure:^(NSError *error)
// handle error
];
请注意,您不要对 NSNotification 做任何事情,因为在这种情况下这将是一个糟糕的设计决策。
一般来说你可以把你所有的请求放在一个RKObjectManager的子类中,如果你的请求很少,但是如果你有超过5-6个请求,你会觉得很乏味并且很难将它们全部保存在一个文件中。所以这就是为什么我建议根据资源来拆分它们。
更新 根据 cmets 提出的问题,在此提供答案
a) 在哪里设置 Base URL?
Base URL 是 RKObjectManager 实例上的一个属性,因此您肯定希望在向 API 发出任何请求之前设置它。对我来说理想的地方是初始化 RKObjectManager 实例。
b) 在哪里定义对象映射?
这又取决于你。对这个问题的回答非常有见地。我会考虑 2 个选项:
-
创建一个单独的类来保存与映射相关的所有对象,例如 MappingProvider。然后,无论何时创建 RKResponseDescriptor 或 RKRequestDescriptor,您只需访问 MappingProvider 的属性即可获取映射。
在管理器的类中定义映射,因为您会将它们分配给将在此管理器中使用的 RKResponseDescriptor 实例。
更新:查看有关 RestKit 设置的博文:http://restkit-tutorials.com/code-organization-in-restkit-based-app/
【讨论】:
哇!这比我考虑的任何东西都要干净。尽管我刚刚花了几个小时来回复您,但其中一些内容让我有些不知所措。我想我知道如何使用块进行回调,但我在哪里设置映射和基本 URL? 更新的回复包括对您的问题的回答以上是关于最佳 RestKit 设置的主要内容,如果未能解决你的问题,请参考以下文章
为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议