Problème fonction asynchrone

Bonjour j’ai un souci sur Xcode. J’ai un while qui récupère des données sur Firebase, (le while ne connais pas le nom des sous dossier). puis après les avoir récupérer je dois lancer une autre fonction. La fonction ne doit pas être appeler plusieurs fois, donc dans le while ça ne marche pas. mais elle dois être appeler après le while. Vu que le while est asynchrone la fonction est appelé avant que le while ce termine. j’ai regarder les complétions, mais je n’est pas compris comment cela fonctionné… Si quelqu’un à une idée? merci d’avance.

Si j’ai bien compris, il faut déclarer le while async, et la fonction await, pour qu’elle attende le while, et si ça prend du temps, mettre une progressView pour que l’utilisateur ne croie pas que rien ne marche et n’aie pas de réaction hâtive.
Il y a quelques cours de Maxime là-dessus.

c’est ça, enfin que l’utilisateur ne crois que rien ne marche, pas vraiment, mais a part ça, oui! La déclaration du Await n’est pas vraiment clair pour moi. J’ai essayé plusieurs chose mais je ne suis pas à l’aise pour cela. Je me permet de mettre mon code et peut-être que tu pourrais m’aider:

func chargerJoueurEtVote() {
informationDesJoueurs.removeAll()
let tmp : resultatVoteNomJoueur = resultatVoteNomJoueur()
tmp.grosseGorgée = grosseGorgée
tmp.partieLongue = partieLongue
tmp.jeuEnEquipe = enEquipe
informationDesJoueurs[nomMaitre] = tmp
print("(informationDesJoueurs): joueur")

    ref.child("partieBideeDrink").child("\(self.codeDePartie)").child("joueurPresent").observeSingleEvent(of: .value) { snapshot in
            let enumerator = snapshot.children
   


            while let rest = enumerator.nextObject() as? DataSnapshot {
            self.ref.child("partieBideeDrink").child("\(self.codeDePartie)").child("joueurPresent").child(rest.key).observeSingleEvent(of: .value) { (snapshot) in
                let value = snapshot.value as? NSDictionary
                let tmp2 : resultatVoteNomJoueur = resultatVoteNomJoueur()
                tmp2.grosseGorgée = value?["dosageGorgée"] as? Int ?? 0
                tmp2.partieLongue = value?["duréePartie"] as? Int ?? 0
                tmp2.jeuEnEquipe = value?["modeJeu"] as? Int ?? 0
                self.informationDesJoueurs[rest.key] = tmp2
                self.joueurConnecte.append(rest.key)
                self.tableauJoueur.reloadData()
                print("\(rest.key): rest.key, gorgée: \(tmp2.grosseGorgée), partie: \(tmp2.partieLongue), equipe: \(tmp2.jeuEnEquipe)")
                
                
                }
                

            }
           
        }
    }

et après cette fonction, appeler la suivante (pas encore fini mais y’a le principe :smile: ):
func trierVote() {
joueurConnecte.removeAll()
let compteJoueur = informationDesJoueurs.count
var voteGrosseGorgée = 0
var votePartieLongue = 0
var voteEnEquipe = 0

    for (code) in joueurConnecte {
            voteEnEquipe += informationDesJoueurs[code]?.jeuEnEquipe ?? 0
            voteGrosseGorgée += informationDesJoueurs[code]?.grosseGorgée ?? 0
            votePartieLongue += informationDesJoueurs[code]?.partieLongue ?? 0
            nombreJoueurLAbel.text = "Nombre joueurs: \(compteJoueur)"
            resultatNiveauAlcool.text = "Vote Gorgées: \(voteGrosseGorgée)"
            resultatDuréePArtie.text = "Vote longueur partie: \(votePartieLongue)"
            equipeOuSoloLabel.text = "Vote Equipe: \(voteEnEquipe)"
        print("joueur: \(code), equipe: \(informationDesJoueurs[code]?.jeuEnEquipe ?? 0), gorgées: \(informationDesJoueurs[code]?.grosseGorgée ?? 0), partie: \(informationDesJoueurs[code]?.partieLongue ?? 0)")
        }

        
    }

Je remarque que ton programme exécute l’une après l’autre des tâches dans l’ordre chronologique, ce ne sont pas complètement des objets qui utilisent leurs méthodes, mais plutôt comme un planning qui s’exécute dans l’ordre ; on est un peu perdu, à la fois on fait tous comme ça lors du premier jet, moi le premier, au lieu de répertorier les objets, d’établir des relations entre eux, de leur créer des méthodes pour ça, des objets intermédiaires quand ça devient compliqué, de faire une sorte de diagramme en réseau, et de repérer les fils d’exécution là-dedans.
Mais là, on bénéficie de ton aide, car tu as dit que c’est le while qui demande une attente. peut-être devrais-tu isoler dans ce while tout ce qui n’est pas graphique — je suppose que le Print final est l’équivalent d’une mise à jour des vues — dans une fonction, que tu pourrais attendre avec un await ? Tu aurais alors des erreurs qui apparaîtraient dans Xcode, et il faudrait équilibrer avec des async jusqu’à la racine de ce qui est asynchrone, en te laissant guider par Xcode ?
Excuse-moi de ne pas pouvoir mieux dire, je suis moi-même aussi peu à l’aise que toi là-dessus…

Je pense que le await() est une bonne solution, le problème c’est que je ne comprend pas vraiment comment il fonctionne, et comment le mettre en place. J’arrive à récupérer de temps en temps quelques infos mais pas la totalité. Si tu as un exemple de code avec le Await je suis preneur pour que je puisse mieux comprendre… Je te remercie!

tu définis ta fonction :
func maFonction (param1, param2, etc.) async → retour, ou void
et quand tu l’utilises :
retour = await maFonction(…)