Rápido cómo hacer que una function se ejecute después de que se complete una function

Hola a todos, soy nuevo en Swift y escribí dos funciones (solo una aplicación de testing de opción múltiple)

func createQuestions() // this goes to Parse, and fetches the questions data that are going to question the users and store them into local arrays func newQuestion() // this also fetches some other data (for example, some incorrect choices) from Parse and read local variables and finally set the labels to correctly display to the users 

Quiero en ViewDidLoad , primero ejecute createQuestion() , luego de que esté completo y luego ejecute newQuestion() . De lo contrario, newQuestion() tiene algunos problemas al leer variables locales que se suponía que debían getse. ¿Cómo voy a manejar eso? Gracias

EDIT: ¡Muchas gracias! ¡Aprendí a usar el cierre! Una pregunta más de seguimiento. Estoy usando un ciclo for para crear preguntas. Sin embargo, el problema es que el bucle for no se ejecuta orderadamente. Entonces mi comprobación de la function repetida (vocabTestedIndices) falla y traería dos preguntas idénticas. Quiero que el ciclo for se ejecute uno por uno, por lo que las preguntas creadas no se superpondrán. ¡gracias! image del código

tratar

 override func viewDidLoad() { super.viewDidLoad() self.createQuestions { () -> () in self.newQuestion() } } func createQuestions(handleComplete:(()->())){ // do something handleComplete() // call it when finished st what you want } func newQuestion(){ // do st } 

¿Qué pasa con el rápido defer de esta publicación ?

 func deferExample() { defer { print("Leaving scope, time to cleanup!") } print("Performing some operation...") } // Prints: // Performing some operation... // Leaving scope, time to cleanup! 

Ya que eres nuevo No sé si sabes cierres o no, así que he puesto una solución simple para ti. (la solución es similar a la de @ Paulw11 comentada en su pregunta) simplemente llame a viewDidLoad:

 self.createQuestions() 

La tarea que desea realizar depende de la respuesta de Parse:
solo después de que llegue la respuesta, desea llamar a la function newQuestion.

Aquí está la documentation de Parse para swift: https://www.parse.com/docs/ios/guide#objects-retrieving-objects

 func createQuestions() { var query = PFQuery(className:"GameScore") query.whereKey("playerName", equalTo:"Sean Plott") query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error: NSError?) -> Void in if error == nil { // The find succeeded. self.newQuestion() } else { // Log details of the failure print("Error: \(error!) \(error!.userInfo)") } } } func newQuestion() { //here is your code for new question function } 

El cierre te ayudará a lograr esta funcionalidad.
Cree su function createQuestions de la siguiente manera.

 func createQuestions(completion:((Array<String>) -> ())){ //Create your local array for storing questions var arrayOfQuestions:Array<String> = [] //Fetch questions from parse and allocate your local array. arrayOfQuestions.append("Question1") //Send back your questions array to completion of this closure method with the result of question array. //You will get this questions array in your viewDidLoad method, from where you called this createQuestions closure method. completion(arrayOfQuestions) } 

viewDidLoad

 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. //Calling createQuestions closure method. self.createQuestions { (arrayOfQuestions) -> () in //Pass your local questions array you received from createQuestions to newQuestion method. self.newQuestion(arrayOfQuestions) } } 

Nuevo método de pregunta

 func newQuestion(arrayOfQuestions:Array<String>){ //You can check your questions array here and process on it according to your requirement. print(arrayOfQuestions) }