在这种情况下,我需要发出两个HTTP GET请求,并且只有在这两个请求都完成之后才能处理它们的结果。我在每个单独的网络请求上都有一个完成处理程序,但它没有帮助,因为我不知道何时检索来自两个请求的数据。
我使用GCD的经验有限,但现在Swift 3发布了,我正在试图弄清楚如何运行多个任务,并为它们提供一个完成处理程序。我的研究表明,GCD或NSOperationQueue可能是我正在寻找的解决方案。有人能建议一下哪种工具适合这项工作,以及Swift 3中的代码可能是什么样子的吗?
发布于 2016-09-17 00:10:44
您应该使用调度组,在发出请求之前进入组,并将组保留在请求的完成处理程序中。因此,让我们假设一下,您有一些执行异步请求的方法,但提供了一个完成处理程序参数,该参数是一个闭包,将在网络请求完成时调用:
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组,在创建请求时进入组,并将组留在异步请求的完成处理程序中。
发布于 2016-09-16 23:39:41
来源:How do I write dispatch_after GCD in 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
});https://stackoverflow.com/questions/39535256
复制相似问题