2017-05-13 6 views
2

Bonjour, je suis nouveau à la programmation rapide et je veux obtenir la valeur label de loadData() pour utiliser l'utilisation de mon chemin (référence) vers ma base de données sur dbRef!.child(place+"/placeLabel"). Ce que je veux dire?! Je lis les données qui sont sur le noeud "Dio Con Dio". Cela arrive parce que la valeur place est let place = "Dio Con Dio". Donc, mon application ne charge pas les données du nœud "Paradosiako - Panorama". Je veux charger tout de la base de données et j'ai pensé que si je pourrais faire la valeur place pour passer au nœud suivant, il pourrait lire toutes les données.Obtenir une valeur let en dehors d'une fonction

import UIKit 
    import FirebaseDatabase 

    class PlacesTableViewController: UITableViewController { 

     //MARK: Properties 
     @IBOutlet weak var placesTableView: UITableView! 

     //database reference 
     var dbRef:FIRDatabaseReference? 

     var places = [Places]() 

     private var loadedLabels = [String: String]() 
     private var loadedRatings = [String: Int]() 

     //handler 
     var handle:FIRDatabaseHandle? 

     override func viewDidLoad() { 
      super.viewDidLoad() 

      dbRef = FIRDatabase.database().reference() 

      // Loads data to cell. 
      loadData() 
     } 

       private func loadData() { 

       let place = "Dio Con Dio" 

       dbRef!.child(place+"/placeLabel").observe(.childAdded, with: { 
        (snapshot) in 
        let label = snapshot.value as! String 
        self.updatePlace(snapshot.key, label: label) 
       }) 
       dbRef!.child(place+"/rating").observe(.childAdded, with: { 
        (snapshot) in 
        let rating = snapshot.value as! Int 
        self.updatePlace(snapshot.key, rating: rating) 
       }) 


      } 

      private func updatePlace(_ key: String, label: String? = nil, rating: Int? = nil) { 
       if let label = label { 
        loadedLabels[key] = label 
       } 
       if let rating = rating { 
        loadedRatings[key] = rating 
       } 
       guard let label = loadedLabels[key], let rating = loadedRatings[key] else { 
        return 
       } 
       if let place = Places(name: label, rating: rating) { 
        places.append(place) 
        placesTableView.reloadData() 
       } 
      } 
     } 

**My Database**

(Cette question est un suivi from this one.)

+0

Pourquoi ne faites-vous pas 'label' un champ d'instance ou faites' loadData() 'retourner un type' String'? Vous pouvez également passer 'label' en tant que paramètre' inout'. –

+0

Vous voulez donc obtenir une valeur de la fonction e, puis la passer à l'étiquette dans loadData? –

+0

je veux fondamentalement la valeur 'label' avant qu'il ne soit initialisé, donc je peux l'utiliser ici:' dbRef! .child (place + "/ placeLabel") '. Je veux assigner la valeur 'label' à la valeur' place'. –

Répondre

2

Pour votre nouveau schéma de base de données, essayez ceci:

private func loadData() { 
    dbRef!.observe(.childAdded) { 
    (placeSnapshot) in 
     print("Adding place \(placeSnapshot.key)...") 

     // Load each label on the "placeLabel" list. 
     let labels = placeSnapshot.childSnapshot(forPath: "placeLabel") 
     for (key, label) in labels.value as! [String: String] { 
      self.updatePlace(key, label: label) 
     } 

     // Load each rating in the "rating" list. 
     let ratings = placeSnapshot.childSnapshot(forPath: "rating") 
     for (key, rating) in ratings.value as! [String: Int] { 
      self.updatePlace(key, rating: rating) 
     } 
    } 
} 

La fonction updatePlace simplement groupes l'étiquette et les propriétés de classement, d'un lieu donné, qui ont été chargées séparément par loadData.

Suppression de lieux. Bien sûr, le code ci-dessus ne gérera pas la suppression des lieux. Pour ce faire, vous devrez également écouter l'événement childRemoved.

+0

"Dio Con Dio", "Paradosiako - Panorama" sont des noms de lieux dans la vie réelle. Cela fonctionne, mais il y a une erreur chaque fois que j'ajoute un nouveau nom de lieu dans la base de données. Disons qu'il y a déjà une note, placeLabel et un commentaire pour Dio Con Dio.Si quelqu'un ajoute une note, un commentaire et une placeLabel pour Dio Con Dio dans ma base de données, il ne tombera pas en panne. Maintenant, si je supprime tous les commentaires Dio Con Dio, notes et placeLabels et que quelqu'un va ajouter pour la première fois un commentaire, une évaluation et une placeLabel pour Dio Con Dio il se bloque, mais il crée ce noeud sur ma base de données. Est ce que tu comprends ça? –

+0

[Voici l'erreur.] (Http://prntscr.com/f8hoap) Je n'ai pas eu l'erreur avec le code précédent. Mais tu as compris ce que je voulais faire! –

+0

Cette erreur est due au fait que votre clé est vide et que vous forcez une correspondance avec "!" Vous devriez seulement essayer d'obtenir la valeur si votre clé n'est pas nulle et pas vide ("") – Mozahler

3

Il est difficile d'expliquer cela dans un commentaire, alors je vais répondre à votre question actuelle, mais Paulo a répondu à votre question, je crois. Vous pourriez même ouvrir une nouvelle question sur ce sujet.

Voici le code que vous rencontrez un problème avec:

for (key, rating) in ratings.value as! [String: Int] { 
      self.updatePlace(key, rating: rating) 
     } 

Il n'y a rien de mal à ce code, aussi longtemps que ratings.value est rempli de chaîne: paires entier. Votre erreur se produit parce que d'une manière ou d'une autre, il manque une clé. (Le moteur d'exécution a trouvé un NSNull, donc il n'a pas pu convertir les données à un dictionnaire)

Vous devez définir un point d'arrêt où vous construisez le tableau dans:

placeSnapshot.childSnapshot(forPath: "rating") 

(qui est appelé notes ici /localement). Si vous pouvez ignorer les entrées sans clé, ignorez-les et ne les ajoutez pas à votre tableau. Mais il est plus probable que vous ayez une erreur et que vous ayez besoin de savoir pourquoi vous ajoutez une valeur nulle ...

Est-ce que cela a plus de sens? S'il vous plaît accepter la réponse de Paulo s'il a résolu un problème, et ouvrez une nouvelle question avec plus d'informations sur childSnapshot (le code), et quelqu'un sera sûr de vous aider. (Je sais que je vais essayer.)

+0

Merci de prendre le temps de faire un suivi sur ma réponse. Votre analyse semble tache sur moi :-) –

+0

@Mozahler J'ai compris votre réponse merci. [J'ai fait une nouvelle question] (http://stackoverflow.com/questions/44023455/retrieve-from-firebase-database-calculating-average) –