处理彼此依赖的并发http请求

时间:2018-02-13 20:57:56

标签: swift concurrency nsurlsession

所以,我有一个复杂的数据来获取,它涉及4个请求,每个请求取决于最后一个的结果,然后一些返回一个列表,所以对于该列表上的每个元素,我必须得到一些信息

上下文

我正在使用YouTube API,我必须获得的数据是用户订阅频道发送的最新视频列表。

以下是执行此操作所需的请求:

  • GET / subscriptions / list [1]

  • GET / channels / list [2]

  • GET / playlistItems / list [3]

  • GET / videos [4]

[1]:返回用户预订频道的列表。返回大小配置为5,因此我必须重复此请求,直到获取所有已订阅的通道

[2]:返回特定频道的已发送视频播放列表的ID

[3]:返回特定频道的最后几个视频

[4]:返回特定视频的信息

首次尝试

首先,我以同步的方式获取数据,也就是说,我执行了请求[1],直到获取了所有通道。然后,我遍历频道列表,并为每个频道执行请求[2]以获取播放列表的ID。然后请求[3]获取n个视频,并针对每个视频,通过请求获取其信息[4]。

问题

问题是将视频返回给用户需要很长时间,所以我想并行执行请求。问题是我需要知道所有请求何时完成运行,按日期重新排序视频列表。为此,我的代码已成为DispatchGroup的一个复杂的混乱。

简而言之,处理这类问题的最佳方法是什么?我有各种依赖于彼此的请求,以及我想执行其中一些并行(第二个 - 我必须为每个频道做)并且需要知道什么时候完成。

2 个答案:

答案 0 :(得分:0)

使用[[0 1 2] [3 4 5] [6 7 8]] [[3 4 5]] 。 DispatchGroup是iOS中的一个“组件”,可以对一些必须等待的相关操作进行分组。

这里你不能直接使用它,为什么?因为URLSession本身在不同于发起者的后台线程上发布Web操作,所以我们必须手动DispatchGroupenter。当操作计数为0时,leave返回。

此代码不是最佳设计模式。但这只能说明在简单的设计模式中可以做些什么。

group.wait

答案 1 :(得分:0)

所以,我正试图用NSURLSession组织这个复杂的请求流程,而我无法找到我想要的代码。

为了更容易使用,我使用Just,这使我能够以更简单,更清晰和简单的方式执行这些请求。

另一种选择是使用PromiseKitNSURLSession包裹在承诺上,这很容易允许chaining of requests