query - realtime database firebase ios
Completando UITableViewController con Firebase Data Swift, Xcode 7 (2)
Estoy trabajando swift
en Xcode 7
. Soy totalmente nuevo en Swift, Xcode, and Firebase
. Me gustaría tener tres UITableViewController
en mi aplicación de iOS. Los dos TableView controllers
necesitarán contenido dinámico y el tercer controlador TableView necesitará contenido estático. Me gustaría que el segundo y el tercer controlador TableView muestren datos basados en lo que se presiona en el controlador anterior TableView. Todos los datos vendrán de mi Firebase. No tengo idea de por dónde empezar. Por favor, apúntame en la dirección correcta! ¡Gracias!
Esta pregunta es amplia, ya que pregunta cómo hacer tres tareas diferentes.
Creo que será mejor que obtengas respuestas si solo pides una cosa a la vez.
Puedo ayudarte a completar un UITableViewController
con Firebase.
class MyTableViewController: UITableViewController {
// your firebase reference as a property
var ref: Firebase!
// your data source, you can replace this with your own model if you wish
var items = [FDataSnapshot]()
override func viewDidLoad() {
super.viewDidLoad()
// initialize the ref in viewDidLoad
ref = Firebase(url: "<my-firebase-app>/items")
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
// listen for update with the .Value event
ref.observeEventType(.Value) { (snapshot: FDataSnapshot!) in
var newItems = [FDataSnapshot]()
// loop through the children and append them to the new array
for item in snapshot.children {
newItems.append(item as! FDataSnapshot)
}
// replace the old array
self.items = newItems
// reload the UITableView
self.tableView.reloadData()
}
}
}
Esta técnica utiliza el evento .Value
, también puedes usar .ChildAdded
, pero luego debes hacer un seguimiento de .ChildChanged
, ''.ChildRemoved'' y .ChildMoved
, lo que puede ser bastante complicado.
La biblioteca FirebaseUI para iOS maneja esto bastante fácilmente.
dataSource = FirebaseTableViewDataSource(ref: self.firebaseRef, cellReuseIdentifier: "<YOUR-REUSE-IDENTIFIER>", view: self.tableView)
dataSource.populateCellWithBlock { (cell: UITableViewCell, obj: NSObject) -> Void in
let snap = obj as! FDataSnapshot
// Populate cell as you see fit, like as below
cell.textLabel?.text = snap.key as String
}
Lo hago un poco diferente cuando tengo un UITableViewController, especialmente para aquellos que pueden presionar a otra vista de detalle / o mostrar una vista modal en la parte superior.
Tener el setObserver en ViewDidAppear funciona bien. Sin embargo, no me gustó el hecho de que cuando miré en una vista de detalle de celdas y luego saqué esa vista, estaba obteniendo de Firebase y volviendo a cargar la tabla, a pesar de la posibilidad de que no se realizaran cambios.
De esta forma, el observador se agrega en viewDidLoad, y solo se elimina cuando se saca de la pila del controlador de Nav. La vista de tabla no se recarga innecesariamente cuando aparece la vista.
var myRef:FIRDatabaseReference = "" // your reference
override func viewDidLoad() {
super.viewDidLoad()
setObserver()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
// only called when popped from the Nav Controller stack
// if I push to another detail view my observer will remain active
if isBeingDismissed() || isMovingFromParentViewController() {
myRef.removeAllObservers()
}
}
func setObserver() {
myRef.observeEventType(.Value, withBlock: { snapshot in
var newThings = [MyThing]()
for s in snapshot.children {
let ss = s as! FIRDataSnapshot
let new = MyThing(snap: ss) // convert my snapshot into my type
newThings.append(new)
}
self.things = newThings.sort{ $0.name < $1.name) } // some sort
self.tableView.reloadData()
})
}
También uso .ChildChanged
.ChildDeleted
y .ChildAdded
en UITableViews
. Funcionan muy bien y le permiten usar animaciones de UITableView
. Es un poco más código, pero nada demasiado difícil.
Puede usar .ChildChanged
para obtener los datos iniciales un elemento a la vez, luego supervisará los cambios después de eso.
Si quiere todos sus datos a la vez en la carga inicial, necesitará .Value, le sugiero que use observeSingleEventOfType
para su primera carga de la tabla vista. Solo tenga en cuenta que si también tiene .ChildAdded
observador .ChildAdded
, también obtendrá un conjunto inicial de datos cuando se agregue ese observador, por lo que debe ocuparse de esos elementos (es decir, no los agregue a su conjunto de datos); de lo contrario, aparecerán sus elementos. dos veces en la carga inicial.