我想在我的应用程序上使用RestKit 0.20,但我对这些部分如何组合起来有点困惑。我的每个视图控制器都需要从服务器获取数据,每个数据在服务器上都有自己的路由,返回不同的对象。我想将所有服务器请求远离视图控制器,以便我可以集中管理它们(但如果有意义的话,可以打开另一个设置)。现在我有以下设置,但我很确定有更好的方法来使用RKObjectManager和RKRouter:
1)每个视图控制器都会触发专用于它的Gateway对象中的方法。
2)该方法将创建请求和响应映射。然后是请求和响应描述,最后是使用手动创建的NSURL的请求操作。
3)在成功块中,我使用NSnotification将响应传递给视图控制器。
有更好的设置吗?我可以只为所有请求使用一个RKObjectManager吗?这是如何运作的?我在网关中将它放在一个单独的方法中吗?有没有更好的方法回到我的视图控制器然后NSNotification?
很抱歉,其中一些是非常基本的。
答案 0 :(得分:8)
我建议使用以下结构(以Instagram为例):
1)首先根据您使用的“资源”拆分所有请求,例如用户/评论/喜欢等
2)为每个“资源”创建一个单独的类,RKObjectManager的子类,例如UsersManager,CommentsManager,LikesManager(全部继承自 RKObjectManager )
3)在每个管理器上定义额外的方法,您将从View Controller中使用这些方法。 例如,为了为用户加载“喜欢”资源,你可以在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个请求,您会发现它很乏味并且很难将所有这些都保存在一个文件中。所以我建议根据资源分割它们。
<强>更新强> 根据评论中提出的问题,在此提供答案
a)在哪里设置基本网址?
基本URL是RKObjectManager实例上的属性,因此您肯定要在向API发出任何请求之前设置它。对我来说理想的地方是RKObjectManager实例的初始化。
b)在何处定义对象映射?
再次取决于你。回答这个问题非常自以为是。我考虑两个选项:
更新:在RestKit设置上查看此博文:http://restkit-tutorials.com/code-organization-in-restkit-based-app/