Comment attendre d'une fonction à la fin sur iOS/Swift avant le départ de la deuxième
J'ai pratiquement aux méthodes, qui sont appelés dans mon viewDidLoad. La première, on obtient de l'utilisateur, les préférences de recherche et enregistre les préférences de variables dans la partie supérieure. Après que j'ai envie d'accès et de travailler avec ces variables dans la seconde fonction. Mais maintenant, les variables sont toujours zéro lorsque je veux accéder à la seconde fonction.
Comment dois-je régler mon viewDidLoad, de sorte que la deuxième fonction n'est exécutée une fois et ma demande de données a été effectué avec succès?
var searchLocation = String()
var searchLocationCoordinates = [String:Double]()
var searchRange = Int()
override func viewDidLoad() {
super.viewDidLoad()
//Gets the user's search preference
getTheSearchLocationAndRange()
//Loads the data from the database
loadDataFromDatabase()
}
J'ai lu des choses à ce jour avec dispatch_asynch ou gestionnaire d'achèvement. Peut-être que quelqu'un peut poster un bout de code qui je peux utiliser dans mon viewDidLoad et rend le travail?
- Vous n'avez pas le dire, mais getThSearchLocationAndRange doit être asynchrone? Dans ce cas, vous ne devriez pas attendre, et faire de votre interface de l'accrocher. Au lieu de cela, vous pourriez faire la première prise de fonction fin de bloc en tant que paramètre et mettre la deuxième fonction que le bloc corps est une façon de le faire, il en existe d'autres.
- Ok ouais je l'ai! Avez-vous un exemple de code qui montre à moi? Mais c'était une idée que j'ai vu dans d'autres posts avec le gestionnaire d'achèvement!
- Est-il une fonction d'envoi en getTheSearchLocationAndRange?
- Salut FredericP Pas il n'y a pas encore de.
- Avez-vous essayé le code que j'ai posté dans ma réponse ?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Swift fermetures! Ils sont fait pour ça.
Veuillez vous référer à la Pomme guide: Fermetures
Voici le code dont vous avez besoin dans votre cas particulier.
FinishedDownload est la fermeture. Lorsque
getTheSearchLocationAndRange()
est appelé, son code est exécuté jusqu'à ce que lecompleted()
ligne qui attend tous les processus de la fonction à la fin. Une fois le processus de finition (téléchargements, par exemple),completed()
les appels à la fermeture, ce qui active le code défini dansgetTheSearchLocationAndRange { () -> () in
. Par conséquent,loadDataFromDatabase()
n'est appelée qu'une foisgetTheSearchLocationAndRange()
a entièrement fini de s'exécuter et les données sont présents (non nul).J'espère que cela a résolu votre problème et répond à votre question 🙂
BTW, sur la "en laissant votre GUI suspendu" partie, Alamofire prend automatiquement soin de cela pour vous. Si vous n'utilisez pas Alamofire, alors vous devez attribuer manuellement la requête asynchrone à un thread d'arrière-plan de sorte que votre interface graphique n'est pas insensible.
J'ai écrit un projet de démonstration et l'a posté sur GitHub qui simule la manipulation d'un réseau asynchrone télécharger. Jetez un oeil à DuncanMC/SwiftCompletionHandlers.
Examiner plus précisément la méthode asyncFetchImage(), n'est presque exactement ce que ce fil parle: Utilise une méthode asynchrone en interne, et prend fin le bloc qu'il appelle une fois le chargement asynchrone est fait.
Qui est la règle générale que vous devez utiliser. Écrire une méthode qui prend fin le bloc/fermeture. En interne, que la méthode d'appel quel que soit asynchrone fonction des besoins et appeler à l'achèvement de la fermeture de l'intérieur de l'asynchrone appel de la méthode à l'achèvement de fermeture.
La fonction
asyncFetchImage
ressemble à ceci:Bon j'ai trouvé une solution. En gros, j'ai appelé la fonction à la fin de la première.
Donc en gros:
getTheSearchLocationAndRange()
fonction moins utile, sauf si c'est toujours censé appelerloadDataFromDatabase
. Si vous voulez que la méthode pour être plus flexible, utilisez l'achèvement de la méthode des blocs.