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

Need to make two HTTP network requests simultaneously (with a completion handler once both finish)

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

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

来源: 您可以为此使用 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
});

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

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:) 的实现可能会有很大差异(例如,您可能让闭包传回数据),但无论您是使用 [=13= 编写自己的网络代码,模式都是相同的] 或使用 Alamofire。只需使用 GCD 组,在创建请求时进入组,并在异步请求的完成处理程序中离开组。