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?
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