需要同时发出两个HTTP网络请求(一旦完成就使用完成处理程序)

Ema*_*n H 6 networking http grand-central-dispatch ios swift

我有一种情况,我需要发出两个HTTP GET请求,并在两个完成后才处理它们的结果.我在每个单独的网络请求上都有一个完成处理程序但它没有帮助,因为我不知道何时检索来自两个请求的数据.

我对GCD的经验有限但是现在Swift 3已经出局了,我试图找出如何运行多个任务并为它们设置一个完成处理程序.我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案.任何人都可以帮助建议适合工作的工具以及Swift 3中代码的外观吗?

Rob*_*Rob 19

您应该使用调度组,在发出请求之前输入该组,并将该组留在请求的完成处理程序中.所以,让我们假设你有一些执行异步请求的方法,但是提供了一个完成处理程序参数,它是一个在网络请求完成时调用的闭包:

func perform(request: URLRequest, completionHandler: @escaping () -> Void) { ... }
Run Code Online (Sandbox Code Playgroud)

要启动这两个并发请求,并在完成后收到通知,您可以执行以下操作:

let group = DispatchGroup()

group.enter()
perform(request: first) {
    group.leave()
}

group.enter()
perform(request: second) {
    group.leave()
}

group.notify(queue: .main) {
    print("both done")
}
Run Code Online (Sandbox Code Playgroud)

显然,您的实现perform(request:)可能会有很大差异(例如,您可能会将闭包传递回数据),但无论您是URLSession使用Alamofire 编写自己的网络代码还是使用Alamofire ,模式都是相同的.只需使用GCD组,在创建请求时进入组,并将组保留在异步请求的完成处理程序中.