NSOperationsQueue:管理相同的请求

NSOperationsQueue: Managing identical requests

在以下情况下我需要打同一个endpoint:

  1. 当视图重新出现在屏幕上时viewWillAppear
  2. 在视图控制器的生命周期中每 5 秒一次(在呈现视图时)。
  3. 应用后 returns 从 backgroundforeground

当我的应用 returns 到 foreground 时,这至少会创建 2 个(如果不是 3 个)concurrent 对相同 endpoint 的请求,尤其是在网速较慢的情况下.

我知道我可以将 Queue 中的 concurrent 请求数限制为 1,但有时我确实需要打几个不同的 endpoints concurrently 所以我希望找到一个替代方案。

我正在使用 NSURLSessionNSOperationsQueue 进行这些调用。是否有使用 NSOperationsQueue 处理此问题的最佳做法?

可以将属于同一任务的 NSOperation 个子类合并(组合)在一起,从而消除任何冗余的网络调用。为了做到这一点,每个操作都需要有一个 identifier ,它对任务(不是操作本身)是唯一的,并且可以用来确定该操作是否在队列中。一旦确定一个操作在队列中,我们就可以获取新操作的 block/closure 回调并将其插入到旧操作结构中,以确保当旧操作的任务完成时,两个回调都会被触发。这有助于避免您的应用程序中缺少回调的情况。

我写了一篇涵盖这个确切主题的文章:

http://williamboles.me/removing-bolierplate-when-coalescing-nsoperations/

请注意,这仅适用于仍在队列中的操作,如果您想根据时间间隔限制操作,则需要延长 "traffic controller",例如 "Code Different"评论了。