Necesita hacer dos requestes de networking HTTP simultáneamente (con un manejador de finalización una vez que ambos terminan)

Tengo una situación en la que necesito realizar dos requestes HTTP GET y manejar sus resultados solo después de que ambos hayan finalizado. Tengo un manejador de finalización en cada request de networking individual pero no es útil, ya que no sé cuándo se recuperan los datos de ambas requestes.

Tengo una experiencia limitada con GCD pero ahora que Swift 3 está fuera, estoy tratando de averiguar cómo ejecutar múltiples tareas y tener un solo controller de finalización para ellos. Mi investigación ha demostrado que GCD o NSOperationQueue puede ser la solución que estoy buscando. ¿Alguien puede ayudar a sugerir qué herramienta encaja en el trabajo y cómo se verá el código en Swift 3?

Debe usar grupos de envío, ingresar al grupo antes de emitir la request y dejar el grupo en el controller de finalización para la request. Por lo tanto, supongamos, por un segundo, que tuvo algún método que realizó una request asincrónica, pero proporcionó un parámetro del manejador de finalización que fue un cierre que se llamará cuando finalice la request de networking:

func perform(request: URLRequest, completionHandler: @escaping () -> Void) { ... } 

Para comenzar estas dos requestes simultáneas, y recibir una notificación cuando terminen, haría algo como:

 let group = DispatchGroup() group.enter() perform(request: first) { group.leave() } group.enter() perform(request: second) { group.leave() } group.notify(queue: .main) { print("both done") } 

Claramente, su implementación de perform(request:) puede variar significativamente (por ejemplo, es posible que tenga que cerrar los datos), pero el patrón es el mismo, ya sea que esté escribiendo su propio código de networking con URLSession o utilizando Alamofire. Simplemente use grupos de GCD, ingrese al grupo cuando cree las requestes y deje el grupo en el manejador de finalización de la request asíncrona.

Fuente: ¿Cómo escribo dispatch_after GCD en Swift 3? Puede usar dispatch_group para eso. Por ejemplo (código 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 });