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

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

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

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

func perform(request: URLRequest, completionHandler: @escaping () -> Void) { ... } 

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

 let group = DispatchGroup() group.enter() perform(request: first) { group.leave() } group.enter() perform(request: second) { group.leave() } group.notify(queue: .main) { print("both done") } 

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

来源: 如何在Swift 3中编写dispatch_after GCD? 您可以使用dispatch_group 。 例如(ObjC代码):

 dispatch_group_t group = dispatch_group_create(); //startOperation1 dispatch_group_enter(group); //finishOpeartion1 dispatch_group_leave(group); //startOperation2 dispatch_group_enter(group); //finishOpeartion2 dispatch_group_leave(group); //Handle both operations completion dispatch_group_notify(group, dispatch_get_main_queue(), ^{ //code here }); 
Interesting Posts