最佳 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 和核心数据的最佳实践

为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议

iOS RestKit 0.2 解析本地 Json 的最佳方法是啥

RESTKit 0.20 - 注销和清除授权标头

使用 RestKit 0.20 备份核心数据

让 RestKit 离开特定的孤立 CoreData 托管对象