gpt4 book ai didi

swift - 处理相互依赖的并发http请求

转载 作者:行者123 更新时间:2023-11-30 11:46:30 26 4
gpt4 key购买 nike

所以,我要获取一个复杂的数据,其中涉及4个请求,每个请求都取决于最后一个请求的结果,其中一些请求返回一个列表,因此对于该列表上的每个元素,我必须获取一些信息.

上下文

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

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

  • 获取/订阅/列表[1]

  • 获取/ channel /列表[2]

  • 获取/playlistItems/列表[3]

  • 获取/视频[4]

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

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

[3]:返回特定 channel 的最后 n 个视频

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

第一次尝试

首先,我以同步方式获取数据,即执行请求[1],直到所有 channel 都已获取。然后,我迭代 channel 列表,并为每个 channel 执行请求 [2] 以获取播放列表的 id。然后请求[3]获取n个视频,对于每个视频,通过请求[4]获取其信息。

问题

问题在于将视频返回给用户需要很长时间,因此我想到并行执行请求。问题是我需要知道所有请求何时完成运行,以便按日期重新排序视频列表。为了做到这一点,我的代码已经变得到处都是 DispatchGroup 的复杂困惑。

那么,简而言之,对于这样的问题,处理的最佳方法是什么,我有各种相互依赖的请求,并且我想并行执行其中一些(第二个 - 我必须为每个 channel 执行),并且需要知道所有这些何时完成。

最佳答案

使用DispatchGroup。 DispatchGroup是iOS中的一个“组件”,可以对一些相关的操作进行分组,必须等待。

这里不能直接使用,为什么?因为 URLSession 本身将 Web 操作发布到与发起者不同的后台线程上,所以我们必须手动进入离开。当操作计数为 0 时,group.wait 返回。

这段代码不是最好的设计模式。但这仅演示了可以通过简单的设计模式完成的操作。

import UIKit

class URLRequestGroup {

var dispatchGroup: DispatchGroup

init(dispatchGroup: DispatchGroup) {
self.dispatchGroup = dispatchGroup
}

init() {
self.dispatchGroup = DispatchGroup()
}

func beginURLRequest(urlRequest: URLRequest,
completionHandler: @escaping (Data?, URLResponse?, Error?) -> ()) {

let urlSession = URLSession(configuration: URLSessionConfiguration.default)
// Enter the dispatchGroup manually
dispatchGroup.enter()
urlSession.dataTask(with: urlRequest, completionHandler: { [weak self] data, urlResponse, error in

completionHandler(data, urlResponse, error)
// Leave this dispatchGroup.
self?.dispatchGroup.leave()
}).resume()

}

}

let group = URLRequestGroup()
group.beginURLRequest(urlRequest: URLRequest(url: URL(fileURLWithPath: "http://www.example.com")), completionHandler: { data, urlResponse, error in

print(data?.count ?? 0)
})
// Put any other request here.
group.dispatchGroup.wait()

关于swift - 处理相互依赖的并发http请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com