RestKit 网络限制在并行请求运行时阻止其他调用

Posted

技术标签:

【中文标题】RestKit 网络限制在并行请求运行时阻止其他调用【英文标题】:RestKit network limits blocks other calls when parallel requests are running 【发布时间】:2014-12-18 10:23:57 【问题描述】:

我们正面临一个问题。 我们有不断下载文件的后台请求(每个文件最多 5MB)。同时,我们有一个 UI,大多数导航都需要 REST 调用。

我们限制了后台下载的数量,因此它不会窒息 RESTkit 使用的 operationQueue。

当在后台下载多个文件时,我们看到网络使用量为 1->2 MB(这是可以理解的)。

问题是:用户在应用程序中导航,每次导航都会调用一个快速 REST 调用,该调用应该返回很少的数据。但由于后台下载,UI 调用需要很长时间(约 10 秒)。

优先级没有帮助,我看到我立即进行的 UI 调用由操作队列处理(因为我们限制了下载限制并且 NSOperationQueue 有更多空间来满足其他请求。

当我们将并发 REST 下载调用限制为 5 时 - 来自 UI 的 REST 调用需要 10 秒。 当我们将并发 REST 下载调用限制为 2 时 - 一切正常。

这里的问题是,因为我们只让后台进行 2 次下载 - 下载文件的整个后台操作将永远持续下去。

最好的情况是,每个 UI 调用都将被视为最重要的网络调用,甚至暂停后台操作,只处理 UI 调用 - 然后恢复后台操作 - 但我不确定它是否可能。

还有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

您可以使用 2 个RKObjectManagers,这样您就有 2 个单独的队列,然后将一个用于“UI”,另一个用于“背景”。最重要的是,您可以为每个队列设置不同的并发限制,并且可以暂停后台队列。请注意,暂停队列并不意味着暂停已经运行的操作,它只是停止启动新操作。

通过这样做,您可以获得一些控制权,但更好的选择实际上是限制数据流,尤其是在移动数据网络上运行时,并通知用户正在发生的事情,以便他们可以接受情况或暂停直到稍后。

【讨论】:

问题是,单独的 NSOperationQueue 队列不是这里问题的原因。我们尝试这样做,但没有帮助 - 结果相同(卡住的 UI)。我们确实限制了并发下载操作,因此队列仍然有插槽来处理 UI 请求。所以 1 或 2 个 RKObjectManagers 之间没有区别,因为我看到 UI 调用立即由队列处理。但是里面的逻辑(可能是网络的东西)花了很多时间。仅当限制为 2 次并行下载时,UI 才能正常工作。这有点令人失望:(还有其他想法吗? 瓶颈很可能是映射,因为每个经理都在运行映射单线程 IIRC。 你能解释更多吗? 2 RKObjectManagers 将有 2 个不同的网络和映射队列,并且映射始终在 RKOM 中单线程运行,以便可以合理地建立连接。 映射开销这么大?我看到我的队列中的下一个项目在一个大下载完成后开始。这就是为什么我认为这是网络瓶颈

以上是关于RestKit 网络限制在并行请求运行时阻止其他调用的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 是不是支持带宽限制?

通过 RestKit 或任何 HTTP 请求上传回形针照片

Restkit,停止记录?

RestKit 请求因 HTTP 错误而挂起

用go写爬虫服务并发请求,限制并发数

Chrome 重大更新,将限制 localhost 访问?