2017-03-27 2 views
0

Ich versuche, verschachtelte Daten mit Firebase zu erhalten. Aber ich habe ein Problem mit meinem Code.Firebase verschachtelte Abfrage mit Abschluss

Meine Feuerbasis Daten:

-contentlikes 
    -userID: true, 
    -userID: true, 
    -userID: true 
-users 
    -userID 
     -name: "John" 

Und mein Code:

override func viewWillAppear(_ animated: Bool) { 
    self.displayUserKeys(completionHandler: { (userKeysInside, errorInside) in 
     if userKeysInside != nil { 
      self.userKeys = userKeysInside! 
      print(self.userKeys) 
     } 
     self.detailUserTableView.rowHeight = UITableViewAutomaticDimension 
     self.detailUserTableView.estimatedRowHeight = 64 
     self.detailUserTableView.dataSource = self 
     self.detailUserTableView.delegate = self 
     self.detailUserTableView.reloadData() 
    }) 
} 

func displayUserKeys(completionHandler: @escaping ([String]?, Error?) ->()) { 
    self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in 
     self.userKeys.removeAll() 
     var userKeyInside = [String]() 
     for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
      let key = child.key 
      userKeyInside.append(key) 
     } 
     completionHandler(userKeyInside, nil) 
    }) { (errorInside) in 
     completionHandler(nil, errorInside) 
    } 
} 

Ich möchte Benutzer erhalten, aber kann nicht herausfinden, wie kann ich tun.

+0

Können Sie den zugehörigen Code aus der DataService-Klasse veröffentlichen? – faircloud

+0

nur CONTENTLIKE_REF = FIRDatabase.database() .referenz (withPath: "contentlikes") – Brkr

+0

Konfigurieren Sie Firebase in Ihrem App-Delegaten? – faircloud

Antwort

1

Sie müssen die Benutzerdetails von einem anderen Benutzerknoten abrufen, basierend auf den Schlüsseln, die Sie von der ersten Abfrage erhalten. Firebase stellt keine Join-Abfrage zur Verfügung und daher müssen wir erneut nach Benutzerdetails fragen, die vom Typ ObserveSingleEvent sind.

Dies ist ein Beispielcode. Ich habe es ohne Xcode-Editor geschrieben, also bitte verzeihen Sie alle dummen Fehler.

 func displayUserKeys(completionHandler: @escaping ([String]?, Error?) ->()) { 
      self.detailUserHandler = DataService.dataService.CONTENTLIKE_REF.observe(.value, with: { (snapshot) in 
       self.userKeys.removeAll() 
       var userKeyInside = [String]() 
       var userFetched = 0 

       for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
        let key = child.key 

        //Query again to fetch user details. 
        DataService.dataService.USER_REF.path(key).observeSingleEvent(.value, with: { (snapshot) in 
           userFetched = userFetched + 1 
           let user = snapshot.value 
           //Append user to the array 
           userInside.append(user) 
         //Return back the array when all the user details as fetched. 
         if(userFetched == snapshot.children.count){ 
          completionHandler(userInside, nil) 
         } 
        }) 
       } 



      }) { (errorInside) in 
       completionHandler(nil, errorInside) 
      } 
     } 
+0

danke für Ihre Antwort. es funktioniert :) – Brkr

+0

if (userFetched == snapshot.children.count) löst einen Fehler aus !? – Learn2Code

+0

Setzen Sie den Wert userFetched während der Initialisierung auf 1. var userFetched = 1 –