Je voudrais qu'une boucle for in envoie un tas de requêtes réseau à Firebase, puis transmette les données à un nouveau contrôleur de vue une fois que la méthode a terminé son exécution. Voici mon code:
var datesArray = [String: AnyObject]()
for key in locationsArray {
let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
datesArray["\(key.0)"] = snapshot.value
})
}
// Segue to new view controller here and pass datesArray once it is complete
J'ai quelques inquiétudes. Tout d'abord, comment attendre que la boucle for soit terminée et que toutes les demandes réseau soient terminées? Je ne peux pas modifier la fonction observeSingleEventOfType, elle fait partie du SDK Firebase. De plus, vais-je créer une sorte de condition de concurrence en essayant d'accéder aux datesArray à partir de différentes itérations de la boucle for (j'espère que cela a du sens)? J'ai lu sur GCD et NSOperation mais je suis un peu perdu car c'est la première application que j'ai créée.
Remarque: le tableau Emplacements est un tableau contenant les clés auxquelles j'ai besoin d'accéder dans Firebase. En outre, il est important que les requêtes réseau soient déclenchées de manière asynchrone. Je veux juste attendre que TOUTES les demandes asynchrones soient terminées avant de transmettre le dateArray au contrôleur de vue suivant.
datesArray
utilisation d'une clé différente.Xcode 8.3.1 - Swift 3
C'est la réponse acceptée de paulvs, convertie en Swift 3:
la source
Swift 3 ou 4
Si vous ne vous souciez pas des commandes , utilisez la réponse de @ paulvs , cela fonctionne parfaitement.
sinon, juste au cas où quelqu'un voudrait obtenir le résultat dans l'ordre au lieu de les déclencher simultanément, voici le code.
la source
dispatchSemaphore.signal()
avant ou après avoir quitté ledispatchGroup
? Vous penseriez qu'il est préférable de débloquer le sémaphore le plus tard possible, mais je ne sais pas si et comment quitter le groupe interfère avec cela. J'ai testé les deux commandes et cela n'a pas semblé faire de différence.Détails
Solution
Usage
Échantillon complet
la source
Vous devrez utiliser des sémaphores à cette fin.
la source
Swift 3: Vous pouvez également utiliser des sémaphores de cette manière. Cela s'avère très utile, en plus, vous pouvez suivre exactement quand et quels processus sont terminés. Ceci a été extrait de mon code:
la source
Nous pouvons le faire avec la récursivité. Obtenez une idée du code ci-dessous:
la source
Le groupe d'expédition est bon mais l'ordre des demandes envoyées est aléatoire.
Dans mon cas de projet, chaque demande nécessaire pour être lancée est la bonne commande. Si cela pouvait aider quelqu'un:
Appel :
Résultat :
Voir pour plus d'infos: Gist
la source