2017-08-08 1 views
0

Also ich ein Forum in meiner App erstellen und beim Abrufen der Themen auf der Datenbank muss ich auch einige Benutzerinformationen wie Bild und Benutzername des ursprünglichen Posters, um es auf die Tabellenansicht Zellen zu holen.Holen Firebase in einem anderen holen

Um die Empfehlung zu halten, die Firebase-Datenbank flach zu halten, habe ich die Nachrichten in einem separaten Ref durchsuchbar nach Schlüssel und NICHT als Kind von Themen.

Ich kann etwas wie opImage und opUsername nicht als Kind von Themen behalten, weil wenn ein Benutzer seinen Benutzernamen oder sein Profilbild ändert, ich es zu jedem Thema ändern müsste, an dem er auch teilgenommen hat.

Was ist der beste Weg, damit umzugehen?

Die Methode zum Abrufen von Firebase würde in etwa so aussehen. Das Problem mit dieser Implementierung besteht darin, dass die Firebase-Aufrufe asynchron sind und es keine Garantie gibt, dass das Bild an das richtige Thema angehängt wird.

DataService.ds.Topics_Base.child(cat.key!).observeSingleEvent(of:.value, with: { (snapshot) in 
     if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {//snapshots = all topics 

      for top in snapshots{ 

       if let dict = top.value as? Dictionary<String,AnyObject>{ 

        guard let title = dict["title"] as? String,let text = dict["text"] as? String,let time = dict["time"] as? String,let username = dict["username"] as? String,let timeSimple = dict["time-simple"] as? String,let lastPost = dict["last-post"] as? String,let open = dict["open"] as? Bool else{ 
         continue 
        } 

        let newTopic = Topic(subject: title, text: text, time: time, topicKey: top.key, username: username) 

        self.allTopics.append(newTopic) 
        print(self.allTopics.count) 

        if let email = dict["email"] as? String{ 
         //FETCH USER INFO FROM EMAIL FETCHED 
         let validEmail = HelperMethods.removeSpecialCharactersFromEmail(email: email) 
         DataService.ds.Users_Base.child(validEmail).observeSingleEvent(of: .value, with: {(snapshot) in 
          if let userDict = snapshot.value as? Dictionary<String,AnyObject>{ 
            if let imgUrl = userDict["profile_image_url"] as? String{ 
            self.allTopics[currentIndex].opImageUrl = imgUrl 
           } 

           self.allTopics.append(newTopic) 


           if (totalTopics == snapshots.count){ 
            DispatchQueue.main.async { 
             self.allTopics.sort { $0.lastPostTime! > $1.lastPostTime!} 
             self.tableView.reloadData() 
             self.refreshControl.endRefreshing() 
            } 
           } 
          } 
         }) 
        } 
       }   } 
     } 
    } 
    ) 
} 

Vielen Dank im Voraus.

Antwort

0

Ich entschied mich schließlich, die Benutzerinformationen NACH dem Abrufen aller Themen und dem anschließenden Durchlaufen des Themarrays und Anhängen von Benutzerinformationen für jedes Thema zu lesen.

Beispiel:

1 - alle Themen holen und Array erstellen

2 - für jedes Thema in Array {

holen Benutzer auf Firebase eine Eigenschaft wie topic.email

Set mit etwas wie:

topic.bildUrl = user.imageUrl

topic.username = user.username

}

Reload Tabellenansicht