维护 RKObjectManager/AFHTTPClient 请求排序

Posted

技术标签:

【中文标题】维护 RKObjectManager/AFHTTPClient 请求排序【英文标题】:Maintaining RKObjectManager/AFHTTPClient request ordering 【发布时间】:2014-10-01 21:05:57 【问题描述】:

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

换句话说(缩写):

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

// ...

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

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

这一切都完全按照它应该的方式工作但前提是获取帖子的请求完成之前获取cmets的请求。否则,评论将不会连接到其帖子,因为尚未获取和映射该帖子。

现在,我通过在获取帖子之前不获取 cmets 来解决这个问题。类似的东西

- (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】:

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

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

【讨论】:

谢谢 - 我明天会调查的。关于最后一个括号的问题:目前我只有 1 个对象管理器,它从 3 个不同的 URL 加载数据,但你听起来好像不太对?我是 RestKit(以及 Core Data)的新手,所以我不知道到目前为止我是否做对了 - 除了它似乎工作:) 听起来不错,只是不清楚您是否从多个服务器获取详细信息。一个基本 URL 通常意味着一个对象管理器(尽管 yhat 不是硬性要求) 明白了。是的,这是一个基本 URL,所以听起来我说得对:)

以上是关于维护 RKObjectManager/AFHTTPClient 请求排序的主要内容,如果未能解决你的问题,请参考以下文章

软件维护

OracleRAC日常基本维护命令

软件维护-第一节:软件维护的概念和特点

软件维护

绝地求生优化服务器维护

项目一众筹网02_5_管理员维护(分页 和 管理员的增删改查)——管理员维护我们使用同步,角色维护我们使用异步(ajax)