Modifier une variable externe à la closure

Bonjour,
j’aimerai pouvoir return une chaine de caractère obtenue dans une closure afin de créer la cellule de ma tableview. Cependant, à l’intérieur de ma closure, ca n’a pas l’air de modifier ma variable cell.

Pouvez-vous m’éclairer svp :slight_smile:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "first_Cell", for: indexPath)
            let userID = (AccessToken.current?.userId)!
            var ref: DatabaseReference!
            ref = Database.database().reference()
            ref.ref.child("server").child("user").child("\(userID)").child("List").child("\(indexPath.row)").observeSingleEvent(of: .value, with: { (snapshot) in
                // Get result value
                let value = snapshot.value as? String
                cell.textLabel?.text = value
            })
            return cell
        }

Si tu affiches dans les logs la variable value de la closure, qu’est-ce que ça donne ?

Hello,

Tout ton appel à Firebase ne devrait pas être dans la création de ta tableview mais à l’extérieur.
Il vaut mieux que tu remplisses un tableau avec les données que tu récupères et ensuite tu fais des appels en faisant array[indexPath.row].

Merci beaucoup à vous deux je vais essayer ça :slight_smile:

Dans la closure ca m’affiche bien la donnée recherchée, et en-dehors ca ne m’affiche rien :confused:

Peux-tu confirmer que ta cellule est une UITableViewCell, rien de plus classique ?

Oui oui bien sur elle est même en Basic

À-tu utilisé le mot clé « self » pour modifier un paramètre externe il me semble que c’est obligatoire dans une closure

Qu’as-tu mis dans la fonction numberOfRowsInSection ?

Ou, plus simple, pourrais-tu nous donner “tout” le code de ta classe, surtout la partie concernant la tableView ?

Je ne connais pas Firebase mais je suppose que le chargement est asynchrone ? Donc cette closure serait appelée bien après que tu aies retourné ta cellule

Merci à tous pour vos réponses.

Oui je viens de lire sur un forum que le chargement était asynchrone :confused:
comment puis-je pallier ça ?

Hello,

Comme je te l’ai dit, il faut que tu charges tes données à l’extérieur de la création de ta TableView.
J’utilise Firebase dans mon projet depuis quelques mois, j’ai toujours fait comme ça et aucun souci pour peupler ma TableView.
D’ailleurs, je ne sais pas où tu as trouvé ce code mais ce n’est pas dans les requirements exposés par Firebase sur leur site.

Partage sinon l’intégralité de ton projet et je te fais voir où il faut que tu fasses les modifications.