最好的RestKit设置

时间:2013-12-05 13:32:48

标签: ios restkit restkit-0.20

我想在我的应用程序上使用RestKit 0.20,但我对这些部分如何组合起来有点困惑。我的每个视图控制器都需要从服务器获取数据,每个数据在服务器上都有自己的路由,返回不同的对象。我想将所有服务器请求远离视图控制器,以便我可以集中管理它们(但如果有意义的话,可以打开另一个设置)。现在我有以下设置,但我很确定有更好的方法来使用RKObjectManager和RKRouter:

1)每个视图控制器都会触发专用于它的Gateway对象中的方法。

2)该方法将创建请求和响应映射。然后是请求和响应描述,最后是使用手动创建的NSURL的请求操作。

3)在成功块中,我使用NSnotification将响应传递给视图控制器。

有更好的设置吗?我可以只为所有请求使用一个RKObjectManager吗?这是如何运作的?我在网关中将它放在一个单独的方法中吗?有没有更好的方法回到我的视图控制器然后NSNotification?

很抱歉,其中一些是非常基本的。

1 个答案:

答案 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)在何处定义对象映射?

再次取决于你。回答这个问题非常自以为是。我考虑两个选项:

  1. 创建一个单独的类来保存与映射相关的所有对象,例如MappingProvider。然后,无论何时创建RKResponseDescriptor或RKRequestDescriptor,您只需访问MappingProvider的属性即可获得映射。
  2. 在manager类中定义映射,因为您将它们分配给将在此管理器中使用的RKResponseDescriptor实例。
  3. 更新:在RestKit设置上查看此博文:http://restkit-tutorials.com/code-organization-in-restkit-based-app/