Cómo ejecutar dos funciones sincrónicamente con operaciones asíncronas en iOS usando Swift

vamos a proponer este escenario

un método con operaciones de networking asincrónicas

func asyncMethodA() -> String? { result : String? Alamofire.manager.request(.POST, "https://www.apiweb.com/apimethod", parameters: parameters, encoding:.JSON) .response { (request, response, rawdata, error) in if (response?.statusCode == 200) { //DO SOME HEAVY LIFTING } } return result //string } 

otro método con operaciones de networking asincrónica

 func asyncMethodB() -> String? { result : String? Alamofire.manager.request(.POST, "https://www.yetanotherapiweb.com/apimethod", parameters: parameters, encoding:.JSON) .response { (request, response, rawdata, error) in if (response?.statusCode == 200) { //DO SOME HEAVY LIFTING } } return result //string } 

un método en el que llamaré a esos methods A y B, para hacer algunas operaciones

 func displayResult { 1) let a = asyncMethodA() 2) let b = asyncMethodB() 3) println(a + b) //some chaotic stuff might happen :( } 

así que la pregunta es cómo podría hacer que (2) espere (1) para ejecutar, y (3) espere (2) y así sucesivamente (que 1,2 y 3 corren sincronizadas)?

(Sé que una respuesta es encadenar asyncMethodA y displayResult en asyncMethodB, pero quiero saber si hay algún otro método)

¡gracias!.

 func anAsyncMethod(resultHandler: (result: AnyObject) -> Void) { ... } func anotherAsyncMethod(resultHandler: (result: AnyObject) -> Void) { ... } let operationQueue = NSOperationQueue() func performWithCompletionHandler(completion: (AnyObject?, AnyObject?) -> Void) { var resultOfOperation1: AnyObject? var resultOfOperation2: AnyObject? let operation1 = NSBlockOperation { let dispatchGroup = dispatch_group_create() dispatch_group_enter(dispatchGroup) self.anAsyncMethod { result in resultOfOperation1 = result dispatch_group_leave(dispatchGroup) } // wait until anAsyncMethod is completed dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER) } let operation2 = NSBlockOperation { let dispatchGroup = dispatch_group_create() dispatch_group_enter(dispatchGroup) self.anotherAsyncMethod { result in resultOfOperation2 = result dispatch_group_leave(dispatchGroup) } // wait until anotherAsyncMethod is completed dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER) } let completionOperation = NSBlockOperation { // send all results to completion callback completion(resultOfOperation1, resultOfOperation2) } // configuring interoperation dependencies operation2.addDependency(operation1) completionOperation.addDependency(operation2) operationQueue.addOperations([operation1, operation2, completionOperation], waitUntilFinished: false) } 

Con el siguiente, puedes lanzar ambos methods asynchronouss al mismo time y hacer tu trabajo pesado después de lo que termine por última vez.

 var methodAFinished = false var methodBFinished = false func asyncMethodA() -> String? { Alamofire.manager.request(.POST, "https://www.apiweb.com/apimethod", parameters: parameters, encoding:.JSON) .response { (request, response, rawdata, error) in if (response?.statusCode == 200) { methodAFinished = true doStuff() } } return result //string } 

Las agallas de asyncMethodB serían methodBFinished = true; doStuff() methodBFinished = true; doStuff()

 func doStuff() { if methodAFinished && methodBFinished { // do crazy stuff } }