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 request but it isn't helpful as I don't know when data from both requests are retrieved.
I have limited experience with GCD but now that Swift 3 is out, I am trying to figure out how to run multiple tasks and have a single completion handler for them. My research has shown that GCD or NSOperationQueue may be the solution I'm looking for. Can anyone help suggest which tool fits the job and what the code might look like in Swift 3?
Source: How do I write dispatch_after GCD in Swift 3? You can use
dispatch_group
for that. For example (ObjC code):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:
To start these two concurrent requests, and be notified when they're done, you'd do something like:
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 withURLSession
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.