realtime query datasnapshot consultas arquitectura ios uitableview firebase

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.