2016-11-14 4 views
0

Hier ist mein Szenario:Bestücken Tableview mit von Firebase erhaltenen Daten

1) Datenquelle zu meinem Tableview ist ein Array books genannt - var books:[BookItem]

2) Ich bevölkern books jederzeit einige Daten in db geändert hat

3) Ich erstelle BookItem durch Verbinden von Daten aus zwei Tabellen, da BookItem besteht aus einigen benutzerspezifischen Daten und einige allgemeine Daten über das Buch selbst.

schrieb ich eine Methode namens createDataSource die Versorgung mit

func createDataSource() 
{ 
    self.books.removeAll() 

    let userId:String = UserDefaults.standard.value(forKey: "UserId") as! String 

    let bookForUserRef = self.ref!.child("users").child(userId).child("userbooks") 

    bookForUserRef.observe(.value, with: { snapshot in 
     var i = 0 

     for element in snapshot.children 
     { 
      i = i + 1 

      let item:FIRDataSnapshot = element as! FIRDataSnapshot 
      let postDict = item.value as! [String : AnyObject] 
      let key = item.key 

      let booksRef = self.ref!.child("books").child(key) 
      booksRef.observe(.value, with: { snapshot in 

       let bookItem = (snapshot as! FIRDataSnapshot).value as! [String : AnyObject] 
       let id = booksRef.key 
       print(id) 
       let record = [bookItem["title"] as! String, bookItem["author"] as! String, "0", "\(bookItem["pagesCount"] as! Int)"] 

       let item = BookItem(title: bookItem["title"] as! String, author: bookItem["author"] as! String, pagesCount: bookItem["pagesCount"] as! Int, currentPage: postDict["currentPage"] as! Int, language: bookItem["language"] as! String, year: nil, ISBN: nil, id: id, added: postDict["added"] as? String ?? "21") 
       self.books.append(item) 
       self.tableView.reloadData() 

      }) 

     } 

    }) 

} 

Immer wenn ich diese Methode wird nennen s BookItem bevöl books Array nimmt in books Array dupliziert, werden alle vorhandenen Elemente.

Ich dachte, es könnte etwas mit for-Schleife zu tun haben, aber nach dem Debuggen scheint es in Ordnung.

Ich vermute, es gibt etwas Bestimmtes mit Beobachtern in Firebase, das die Elemente dupliziert. Ich bin ziemlich neu in der Firebase und ich nehme an, dass meine Herangehensweise etwas verwirrt und verwirrend sein könnte.

Was sollte in der createDataSource() Methode geändert werden, um Elemente Duplikation loszuwerden?

Auch, ist mein Ansatz zur Arbeit mit Firebase und TableView korrekt?

+1

Sie sollten einen Blick auf Ihre Loops und Beobachter nehmen, es sieht ein bisschen komisch. Haben Sie versucht, 'self.books.removeAll()' an den Anfang des ersten Wertbeobachters zu setzen? Wenn das funktioniert, sollten Sie 'self.tableView.ReloadData()' auch an das Ende des ersten Beobachters verschieben. – ntoonio

Antwort

0

Dank @ntoonio Kommentar ich es

gelöst bekam
func createDataSource() 
{ 

    let userId:String = UserDefaults.standard.value(forKey: "UserId") as! String 

    let bookForUserRef = self.ref!.child("users").child(userId).child("userbooks") 

    bookForUserRef.observe(.value, with: { snapshot in 
     var i = 0 
     self.books.removeAll() 
     for element in snapshot.children 
     { 
      i = i + 1 

      let item:FIRDataSnapshot = element as! FIRDataSnapshot 
      let postDict = item.value as! [String : AnyObject] 
      let key = item.key 

      let booksRef = self.ref!.child("books").child(key) 
      booksRef.observe(.value, with: { snapshot in 

       let bookItem = (snapshot as! FIRDataSnapshot).value as! [String : AnyObject] 
       let id = booksRef.key 
       print(id) 
       let record = [bookItem["title"] as! String, bookItem["author"] as! String, "0", "\(bookItem["pagesCount"] as! Int)"] 

       let item = BookItem(title: bookItem["title"] as! String, author: bookItem["author"] as! String, pagesCount: bookItem["pagesCount"] as! Int, currentPage: postDict["currentPage"] as! Int, language: bookItem["language"] as! String, year: nil, ISBN: nil, id: id, added: postDict["added"] as? String ?? "21") 
       self.books.append(item) 
       self.tableView.reloadData() 


      }) 

     } 

    }) 

} 
+0

Während dies funktioniert, wird davon abgeraten, eine Sammlung von Büchern als ein einzelnes Schlüssel/Wert-Paar (d. H. Ein Objekt) zu behandeln. Sollte [mit Listen arbeiten] verwenden (https://firebase.google.com/docs/database/ios/lists-of-data). – Kato

+0

@Kato könnten Sie den richtigen Umgang mit Listen bieten? – DCDC

Verwandte Themen