【问题标题】:NSOperationsQueue: Managing identical requestsNSOperationsQueue:管理相同的请求
【发布时间】:2016-08-27 22:44:30
【问题描述】:

在以下情况下我需要打相同的endpoint

  1. 当一个视图重新出现在屏幕上时viewWillAppear
  2. 在视图控制器的生命周期内每 5 秒(在呈现视图时)。
  3. 应用从background返回到foreground后。

当我的应用返回到foreground 时,这会创建至少 2 个(如果不是 3 个)concurrent 请求到同一个 endpoint,尤其是在互联网连接速度较慢的情况下。

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

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

【问题讨论】:

  • 您可以编写一个流量控制器类来管理队列。如果 URL 操作处于挂起状态或在过去 5 秒内完成,则忽略新的插入请求。

标签: ios swift nsurlsession nsoperation nsoperationqueue


【解决方案1】:

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

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

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

请注意,这仅适用于仍在队列中的操作,如果您想根据时间间隔限制操作,那么您需要扩展您的“流量控制器”,如“代码不同”评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2022-01-24
    • 2014-02-10
    • 2018-06-20
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多