I have a situation where I need to make two HTTP GET requests and handle their results only after both are finished. I have a completion handler on each individual network r
You should use dispatch groups, entering the group before you issue the request, and leaving the group in the completion handler for the request. So, let's assume, for a second, that you had some method that performed an asynchronous request, but supplied a completion handler parameter that was a closure that will be called when the network request is done:
func perform(request: URLRequest, completionHandler: @escaping () -> Void) { ... }
To start these two concurrent requests, and be notified when they're done, you'd do something like:
let group = DispatchGroup()
group.enter()
perform(request: first) {
group.leave()
}
group.enter()
perform(request: second) {
group.leave()
}
group.notify(queue: .main) {
print("both done")
}
Clearly, your implementation of perform(request:)
may vary significantly (e.g. you might have the closure pass the data back), but the pattern is the same whether you are writing your own networking code with URLSession
or using Alamofire. Just use GCD groups, entering the group when you create the requests, and leaving the group in the completion handler of the asynchronous request.