2017-07-24 8 views
0

Avant d'envoyer des données à Firebase, je m'assure qu'une valeur existe définitivement. À différents endroits de mon application, je tire ces données de la base de données Firebase. Y at-il une chance qu'une erreur puisse être commise pendant que Firebase récupère ces données et qu'elle renvoie zéro au lieu des données réelles?Swift iOS - Est-il possible que Firebase corrompe des données et renvoie une valeur nulle même si des données valides existent?

Fondamentalement, Firebase peut-il corrompre des données valides et les renvoyer sous la forme d'une valeur nulle?

nameRef?.observeSingleEvent(of: .value, with: { 
      (snapshot) in 

      if let dict = snapshot.value as? [String:Any]{ 

       //100% these have valid data 
       //but if either of these get corrupted and returned as nil there will be a crash 
       let firstName = dict["firstName"] as? String 
       let lastName = dict["lastName"] as? String 

       self.firstNameLabel.text! = firstName! 
       self.lastNameLabel.text! = lastName!    
      } 
} 

Je sais que je peux utiliser if let pour éviter un accident, mais je veux savoir est-il encore nécessaire? J'ai beaucoup plus de données tirées puis prénom et nom et je devrais utiliser if let partout. Même si c'est la chose sûre à faire, il ajoute beaucoup de code dans mon application. Si inutile, je ne l'utiliserai pas.

if let firstName = firstName{.... 
if let lastName = lastName{.... 

Ceci est la première fois que la construction d'une application, et je ne l'ai jamais travaillé ou avec une équipe avant donc je ne connais pas la réponse à une question comme ça.

Répondre

1

Non, lorsque vous récupérez des valeurs dans Firebase, vous êtes sûr d'obtenir correctement les valeurs de la base de données, lorsque les valeurs ne sont pas dans votre cache. Une erreur commune que je vois ici est qu'ils ont persistence sur appDelegate là, et ils ne synchronisent pas la base de données avant de capturer un seul événement, comme vous le faites. Lors de l'utilisation de childAdded, childRemoved etc., la base de données est toujours synchronisée, vous n'avez donc pas à appeler keepSynched/désactiver la persistance.

Le code ci-dessous semble plus propre, plus sûr et plus compréhensible. Je viens d'ajouter des valeurs par défaut.

nameRef?.observeSingleEvent(of: .value, with: { 
      (snapshot) in 
       let values = snapshot.value as? NSDictionary 
       self.firstNameLabel.text! = dict["firstName"] as? String ?? "No first name given" 
       self.lastNameLabel.text! = dict["lastName"] as? String ?? "No last name given" 
} 

Si vous avez la persistance dans votre appDelegate, appelez nameRef? .keepSynced (true) avant la saisie des données avec un observeSingleEvent. Ne pas appeler cela peut entraîner des valeurs de cliché étranges, comme celui-ci: How to retrieve data from firebase using Swift?

+0

merci! Je n'ai pas encore rencontré de synchronisation de cache local avec firebase. C'est un nouveau concept pour moi, mais je pense qu'il serait plus facile et plus sûr de simplement envoyer et retirer les données à partir de là, d'autant plus que le cache est purgé. Quoi qu'il en soit, j'aime l'alternative que vous avez l'habitude d'un laisser en fournissant les valeurs après? chaîne ?? "... très propre en effet! –