我建议采用以下结构(以 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/