Ios 需要同时发出两个HTTP网络请求(两个请求都完成后使用完成处理程序)

Ios 需要同时发出两个HTTP网络请求(两个请求都完成后使用完成处理程序),ios,swift,http,networking,grand-central-dispatch,Ios,Swift,Http,Networking,Grand Central Dispatch,在这种情况下,我需要发出两个HTTPGET请求,并在两个请求都完成后处理它们的结果。我在每个单独的网络请求上都有一个完成处理程序,但它没有帮助,因为我不知道何时从两个请求中检索数据 我在GCD方面的经验有限,但现在Swift 3已经推出,我正试图找出如何运行多个任务,并为它们提供一个单一的完成处理程序。我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案。有人能帮我推荐适合这项工作的工具,以及Swift 3中的代码是什么样子的吗?来源: 您可以使用dispatch\u

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

我在GCD方面的经验有限,但现在Swift 3已经推出,我正试图找出如何运行多个任务,并为它们提供一个单一的完成处理程序。我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案。有人能帮我推荐适合这项工作的工具,以及Swift 3中的代码是什么样子的吗?

来源: 您可以使用
dispatch\u group
进行此操作。 例如(ObjC代码):


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

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组,在创建请求时输入该组,并将该组保留在异步请求的完成处理程序中。

GCD或NSOperationqueue可以使用。GCD:看看这个[当添加到组中的两个任务都完成后,group.notify的闭包是否本质上起到了完成处理程序的作用?另外,当我们将闭包输入到组中时,它如何知道在我们完成添加所有请求之前推迟执行?我问,因为如果它在我添加第二个请求之前完成第一个请求,并在添加第二个请求时调用notify会怎么样第二个仍在等待中。这通常不是问题吗?是的,当所有的
enter
调用与相应的
leave
调用平衡后,就会调用关闭。因此,只有在收到所有
leave
调用后,才会调用调度组
notify
块。我为接二连三的调用表示歉意问题,但这是否意味着第一个函数可能离开组并在第二个函数进入组之前调用notify?理论上是可能的,但在处理异步请求时,这是极不可能的。如果是这样,也没关系,因为
notify
已关闭d、 到那时为止,已经有两次
enter
调用,因此在有两次
leave
调用之前,该组不会发出
notify
。这种模式是坚如磐石的。只要确保在调用所有先决条件
enter
调用之前,您不会调用
notify
:如果您这样做,它将不会出现问题执行
notify
块,直到所有相应的
leave
调用都完成。@Rob我正试图使用调度组执行一个异步请求的repeat while。我不确定如何阻止检查while循环的条件,直到我从上一次调用中得到响应。这是什么这可以通过派遣小组来完成,或者你有没有更好的建议
let group = DispatchGroup()

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

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

group.notify(queue: .main) {
    print("both done")
}