/ / Esegui il codice solo al termine dell'esecuzione della funzione asincrona: ios, swift, asynchronous, parse.com

Esegui codice solo dopo che la funzione asincrona termina l'esecuzione - ios, swift, asincrono, parse.com

Sono relativamente nuovo su Swift e Xcode in generale e trovo molte difficoltà nel cercare di capirlo.

Sto sviluppando un'app che utilizza l'estensione Parse.com server di backend.Per non bloccare il thread principale, ogni volta che l'app scarica qualcosa dal server, viene eseguito su un thread diverso, in modo asincrono. Tuttavia, il resto del codice continua a essere eseguito sul thread principale e si arresta in modo anomalo quando i dati che dovrebbe avere dal server non sono stati ancora scaricati. Vorrei sapere come chiamare le funzioni da eseguire al termine della funzione asincrona e questo deve essere fatto per le funzioni in file separati.

Ho letto che le chiusure potrebbero aiutare con questo, ma ho trovato la sintassi molto difficile e una spiegazione sarebbe molto apprezzata. Ma comunque sarebbe molto utile.

Grazie

risposte:

13 per risposta № 1

Bene, chiami semplicemente la funzione alla fine della richiamata asincrona. Questo è quando il callback asincrono è terminato - è quando tutto il resto nel callback asincrono è finito! Quindi, ad esempio:

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

Se il problema è che non lo fai conoscere quale funzione chiamare, puoi configurare la funzione / oggetto circostante in modo che qualcuno possa farlo mano tu una funzione che è quindi ciò che chiami nel punto in cui ho detto "chiama la funzione" sopra.

Per esempio:

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 ...
}

3 per risposta № 2

Espandendo la risposta di Matt, puoi rendere myMethod un metodo che prende una chiusura come parametro:

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