所以,我有一个复杂的数据来获取,它涉及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的一个复杂的混乱。
简而言之,处理这类问题的最佳方法是什么?我有各种依赖于彼此的请求,以及我想执行其中一些并行(第二个 - 我必须为每个频道做)并且需要知道什么时候完成。
答案 0 :(得分:0)
使用[[0 1 2]
[3 4 5]
[6 7 8]]
[[3 4 5]]
。 DispatchGroup是iOS中的一个“组件”,可以对一些必须等待的相关操作进行分组。
这里你不能直接使用它,为什么?因为URLSession本身在不同于发起者的后台线程上发布Web操作,所以我们必须手动DispatchGroup
和enter
。当操作计数为0时,leave
返回。
此代码不是最佳设计模式。但这只能说明在简单的设计模式中可以做些什么。
group.wait
答案 1 :(得分:0)
所以,我正试图用NSURLSession
组织这个复杂的请求流程,而我无法找到我想要的代码。
为了更容易使用,我使用Just,这使我能够以更简单,更清晰和简单的方式执行这些请求。
另一种选择是使用PromiseKit将NSURLSession
包裹在承诺上,这很容易允许chaining of requests。