维护RKObjectManager / AFHTTPClient请求排序

时间:2014-10-01 21:05:57

标签: ios restkit afnetworking

我有一个使用RestKit和核心数据持久性的iOS应用程序。它从几个不同的端点加载其数据,其中大多数端点将完整的对象图作为嵌套的JSON对象返回。但是其中一个端点将包含外键引用(不是嵌套的JSON)的对象返回到另一个端点的数据。

换句话说(缩写):

[postMapping addAttributeMappingsFromArray:@[ @"postID", ... ]];

// ...

[commentMapping addAttributeMappingsFromArray:@[ ... ]];
[commentMapping addConnectionForRelationship:@"post" connectedBy:@"postID"];

相关的PostComment实体设置了适当的关系,等等。

这一切都与完全一样,但只有获取帖子的请求在获取评论的请求之前完成。否则,评论将无法与其帖子相关联,因为该帖子尚未被提取和映射。

现在,我通过在获取帖子之前不提取评论来解决这个问题。像

这样的东西
- (void)fetchPosts {
    [objectManager getObjectsAtPath:@"/posts.json"
                         parameters:nil
                            success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                [self fetchComments]; // *now* we can fetch comments
                                // ...

但我想知道是否有更好的方式?

我想我可能会做类似

的事情
 [objectManager.HTTPClient.operationQueue setMaxConcurrentOperationCount:1];

但大部分时间,我想要并发请求。它只有两个必须连续的请求。

我想我可以设置两个不同的对象管理器(一个执行顺序请求,一个执行并发请求),但我不确定是否有意义。

那么,有没有办法指定应该按顺序处理两个特定的-getObjectsAtPath:...请求,而其他所有请求都可以随时运行?

1 个答案:

答案 0 :(得分:1)

查看创建另一个请求描述符,该描述符深入查看注释详细信息并仅处理postID属性。对于每个,运行postMapping以创建存根对象。

请注意,您可能仍会遇到具有2个不同背景上下文的竞争条件,这两个背景上下文同时创建相同的对象,因此您可能需要处理合并问题(这是因为您在讨论多个端点时有多个对象管理器)。