Dans mon application j'utilise Firebase Realtime Database pour stocker des données sur les utilisateurs. J'aimerais que lorsque je lis ces données pour les afficher dans la vue (ex : leur pseudo), être sûr que la lecture ait bien été faite avant de les afficher. Je m'explique :
//Initialisation des propriétés de l'utilisateur
static func initUsers(){
let usersref = dbRef.child("Users").child(userId!)
usersref.observeSingleEvent(of: .value) { (DataSnapshot) in
if let infos = DataSnapshot.value as? [String : Any]{
self.username = infos["username"] as! Int
//On prévient le VC que les données ont été récupérées
let name = Notification.Name(rawValue: "dataRetrieved")
let notification = Notification(name: name)
NotificationCenter.default.post(notification)
}
}
}
Voilà le code qui s'effectue dans le modèle et qui lis les données de l'utilisateur lorsque celui si se connecte.
var isFirstAppearance = true
override func viewDidLoad() {
super.viewDidLoad()
//On initialise les propriétés associées à l'utilisateur
Users.initUsers()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if isFirstAppearance {
let name = Notification.Name(rawValue: "dataRetrieved")
NotificationCenter.default.addObserver(self, selector: #selector(registerDataToView), name: name, object: nil)
isFirstAppearance = false
}
else{
registerDataToView()
}
}
//On affecte les données de l'utilisateur à la vue
@objc func registerDataToView(){
usernameLabel.text = String(Users.username)
}
Ici on se trouve dans le VC et lorsque la vue se charge on appel initUsers dans viewDidLoad. Dans viewWillAppear, si c'est la première qu'on charge la vue alors on crée un écouteur qui appel registerDataToView si la lecture dans la base de donnée est finie. Sinon on appel simplement registerDataToView (c'est pour mettre à jour les labels quand on revient sur ce VC).
J'aimerais d'abord savoir si il est possible, par exemple lorsque l'on a une très mauvaise connexion, que l'écouteur n'intercepte pas la notification dataRetrieved et donc que mon UI n'affiche que les textes par défaut ? Ou alors est ce que l'écouteur attend de recevoir la notification pour passer à la suite ?
S'il n'attend pas alors comment je peux faire pour attendre que la lecture en base de donnée soit finie avant d'initialiser les labels ?
Merci de votre temps
- Edité par Wakate-joker 28 mai 2021 à 20:56:36
Attendre le résultat d'une lecture en bdd
× 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.