Dans mon application j'ai une propriété calculée qui, lorsque l'on souhaite obtenir sa valeur, effectue une lecture dans la base de donnée pour lire le champ lui correspondant :
static var total : Int {
get{
var value = 0
let ref = Users.dbRef.child("Users").child(Users.userId!).child("total")
ref.observe(DataEventType.value) { (DataSnapshot) in
value = DataSnapshot.value as? Int ?? -1
}
return value
}
set{
Users.dbRef.child("Users").child(Users.userId!).child("total").setValue(newValue)
}
}
Voilà le code de base que j'ai écris. Seulement, comme la fonction observe est lente (elle effectue une lecture en base de donnée) et dans un thread différent alors le retour de mon getter s'effectue toujours avant l'affectation de la valeur à value dans la closure.
J'ai donc essayé différentes méthodes pour attendre la fin de la fonction observe comme l'utilisation d'un semaphore ou encore une simple boucle infinie avant le return value :
while value == 0 {}
return value
Seulement observe ne s'effectue qu'après le return value, j'attend donc indéfiniment. J'ai d'abord pensé que c'était parce que la closure était @escaping mais ça n'a pas de sens car cela signifie qu'elle s'effectue à la fin de la fonction observe et non pas à la fin de mon getter, ou alors ce n'est pas du tout comme ça que ça se passe. Mais en tout cas je ne comprend pas pourquoi la valeur de value ne se met jamais à jour dans le while.
Si quelqu'un a une solution je suis preneur merci
- Edité par Wakate-joker 27 mai 2021 à 21:00:52
Attendre la fin d'une closure en swift
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.