Érdemes megfontolni egy másik szerkezetet
fruits
fruit_id_0 <- key created with childByAutoId
name: "Apple"
color: "Red"
taste: "blah blah"
Innentől kezdve rengeteg lehetőséged van.
Az egyik lehetőség a .childAdded használata, amely az összes csomóponton áthalad, egyenként, és hagy egy megfigyelőt, aki értesíti az alkalmazást, ha új gyermeket adnak hozzá. A dataSource tömb név szerint van rendezve a kódban.
let fruitsRef = self.ref.child("fruits")
fruitsRef.observe(.childAdded, with: { snapshot in
let fruitDict = snapshot.value as! [String: Any]
let fruitName = fruitDict["name"] as! String
self.fruitArray.append(fruitName)
self.fruitArray.sort() //sorts in place
self.myTableView.reloadData()
})
Innentől kezdve, amikor új gyümölcsöt adnak hozzá, a bezárást hívják. Az újonnan hozzáadott gyümölcs hozzáadódik, a tömb rendeződik, és a felhasználói felület frissül.
Ha csak néhány bejegyzése van, a fenti rendben van, de ha sok gyümölcse van, mint én, akkor minden egyes gyümölcs betöltése után rendezi és frissíti a tableView-t, ami villogást vagy más nem kívánt eredményt okozhat.
Jobb megoldás lenne kihasználni azt a tényt, hogy az .value megfigyelők a .gyermek megfigyelők hozzáadását követően jelennek meg. Ezt szem előtt tartva betöltheti a teljes kezdeti adatkészletet, és ha ez kész, rendezze azt, és frissítse a tableView-t. Ezzel egyidejűleg egy megfigyelőt hagy az új gyümölcsök számára, amely hozzáadja azt az adatforráshoz, rendezi és frissíti a felhasználói felületet.
Íme néhány kód, amely gombkattintással indítható el
func button0() {
self.configureChildAdded()
self.setInitialLoadCompleted()
}
két osztályvar, hogy nyomon kövessük, hol tartunk a betöltési folyamatban, és egy tömb a gyümölcsnevek tárolására
var initialLoad = true
var fruitArray = [String]()
majd két osztály, amely kezdetben betölti és rendezi a gyümölcsöket, és hagy egy .childAdded megfigyelőt, amely figyeli a további gyümölcsöket, és hozzáadja őket az adatforráshoz, rendezi és frissíti a táblázatot.
func configChildAdded() {
let fruitsRef = self.ref.child("fruits")
fruitsRef.observe(.childAdded, with: { snapshot in //iterate over all fruits
let fruitDict = snapshot.value as! [String: Any]
let fruitName = fruitDict["name"] as! String
self.fruitArray.append(fruitName)
//upon first load, don't reload the tableView until all children are loaded
if ( self.initialLoad == false ) {
self.fruitArray.sort()
self.myTableView.reloadData()
}
})
}
//this .value event fires AFTER the child added events to load the tableView the first time
// all this does is update the UI and set the initalLoad to true and only fires once
func setInitialLoadCompleted() {
let fruitsRef = self.ref.child("fruits")
fruitsRef.observeSingleEvent(of: .value, with: { snapshot in
self.myTableView.reloadData()
self.initialLoad = false
})
}
Ne feledje, hogy ezzel a módszerrel teljesen elkerülhető a Firebase bármilyen típusú rendezése, ahogy az a kódban történik. Ez sokkal könnyebbé tenné a több mezős rendelést stb.
08.08.2018