Ejecutar código solo después de que la función asíncrona termine de ejecutarse

Soy relativamente nuevo en Swift y Xcode en general y me resulta muy difícil tratar de resolver esto.

Estoy desarrollando una aplicación que utiliza el servidor backend de Parse.com . Para no bloquear el hilo principal, cada vez que la aplicación descarga algo desde el servidor, se realiza en un hilo diferente, de forma asíncrona. Sin embargo, el rest del código continúa ejecutándose en el hilo principal y se bloquea cuando aún no se han descargado los datos que se supone que tienen del servidor. Me gustaría saber cómo llamar a las funciones para que se ejecuten después de que finalice la función asíncrona, y esto tiene que hacerse para las funciones en archivos separados.

Leí que los cierres podrían ayudar con esto, pero encontré que la syntax era muy difícil y una explicación sería muy apreciada. Pero cualquier forma sería muy útil.

Gracias

Bueno, simplemente llama a la función al final de la callback asincrónica. ¡Es cuando la callback asíncrona ha finalizado, es cuando todo lo demás en la callback asíncrona ha terminado! Así por ejemplo:

 func myMethod() { // ... code ... somebody.doSomethingWith(someObject, asynchronousCallback: { (thing, otherThing) in // ... do whatever // --> CALL THE FUNCTION! }) // ... code ... } 

Si el problema es que no sabe a qué función llamar, puede configurar su objeto / función circundante para que alguien pueda darle una función que es entonces lo que llama en el lugar donde dije “llamar a la función” en el punto anterior .

Por ejemplo:

 func myMethod(f:() -> ()) { // we receive the function as parameter // ... code ... somebody.doSomethingWith(someObject, asynchronousCallback: { (thing, otherThing) in // ... do whatever // --> CALL THE FUNCTION, by saying: f() }) // ... code ... } 

Ampliando la respuesta de Matt, puedes hacer de myMedhod un método que toma un cierre como parámetro:

 ​func​ ​myMethod​(​completionBlock​: (result: String) -> ()) { // ... code ... somebody.doSomethingWith(someObject, asynchronousCallback: { (thing, otherThing) in // ... do whatever completionBlock(thing) }) // ... code ... }