info googleservice google firapp configurar agregar ios swift firebase firebase-database

ios - googleservice - Firebase Swift 3 Xcode 8: iterar a través de los resultados de observación



googleservice info (3)

He consultado los documentos de Firebase y los tutoriales de Stack Overflow y YouTube, pero puedo averiguar cómo obtener los datos si los obtengo a través de Firebase.

Soy nuevo en Firebase y en el proceso de cambiar mi proyecto de Parse a Firebase.

Ejemplo: tengo una información en Firebase que se ve así:

Puedo captar todos los temas en Swift haciendo esto:

let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in for child in snapshot.children { print("child ------") print(child) // Get the bits HOW DO I PARSE EACH SET } })

Cuando repito el for-loop, imprimo cosas que se ven así:

child ------ Snap (-KYCqk2_AVkUd8s9cKit) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Match states with their capitals"; name = "State Caiptals"; tags = { 0 = Geography; 1 = USA; }; } child ------ Snap (-KYCqk2_AVkUd8s9cKiu) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Name the parts of an Atom"; name = "Parts of an Antom"; tags = { 0 = Physics; 1 = Atom; 2 = Electron; }; }

Mi problema es cómo puedo obtener los datos:

Necesito la clave (KYCqk2_AVkUd8s9cKiu) Necesito la descripción y el nombre Necesito una serie de etiquetas

- todo en variables locales?

Básicamente, solo quiero leer en todos los Topics y tener una variedad de Topics en la memoria local.

Puedo encargarme de compilar la matriz del tema Clase, pero he intentado varios enfoques para obtener los datos sin suerte. Debe haber una manera fácil de analizar el resultado, pero no he encontrado un ejemplo o documentación.

Agradecería alguna ayuda o puntero a algún documento o tutorial.

==============================

Código actualizado

Hola, cambié el código para intentar hacer coincidir la muestra provista. El código ahora se ve a continuación Puse en un contador de bucle para ver qué está pasando y por qué se bloquea.

FDataSnapshot no está definido, así que utilicé FIRDataSnapshot.

Aquí hay un nuevo intento de código que ahora falla. Más adelante, muestro mis cambios para que no se cuelguen, y una pregunta acerca de cómo entregar las etiquetas en el subnodo de forma segura . Gracias por el puntero. Ahora tengo algo que funciona.

// HERE is a way to get all the Topics let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in if snapshot.value is NSNull { print("not found") } else { var loopCount = 1 // count loops to see how may time trying to loop for child in snapshot.children { print(" ") print(" ") print("child ------ loop /(loopCount)") print(child) let snap = child as! FIRDataSnapshot //each child is a snapshot let dict = snap.value as! [String: String] // the value is a dictionary let name = dict["name"]! let description = dict["description"]! let createdBy = dict["createdBy"]! print("the bits ------") print("name .... /(name)") print("description .... /(description)") print("createdBy .... /(createdBy)") loopCount += 1 } } })

Tengo cero puntos de ruptura definidos; sin embargo, el código se detiene en este punto de interrupción (cuando tengo cero puntos de corte definidos con seguridad)

libswiftCore.dylib`_swift_bridgeNonVerbatimFromObjectiveC: 0x1144a4270 <+0>: pushq %rbp 0x1144a4271 <+1>: movq %rsp, %rbp 0x1144a4274 <+4>: pushq %r15

... se rompe aquí tres veces y luego la aplicación se bloquea en esta línea, ¡deje dict = snap.value como! [String: String] con el mensaje "Subproceso 1: EXC_BAD_INSTRUCTION (código = EXEC_1386_INVOP, subside = 0x0)

No estoy seguro de por qué el código tiene punto de interrupción y por qué se bloquea. Tal vez se estrelló cuando golpea las etiquetas porque las etiquetas son subnodo y no se ajustan a [String, String]

¡Imprimo esto en el registro y luego voy boom!

child ------ loop 1 Snap (-KYI2MszjC9pK_4oIvKu) { createdBy = FeMFeeDat4VZb5tmFO2tKixgQIy1; description = "Match states with their capitals"; name = "State Caiptals"; tags = { 0 = Geography; 1 = USA; }; }

=====

Si cambio la línea para usar ''Cualquiera'' ... entonces funciona

let dict = snap.value as! [String: Any]

nuevo código de trabajo ....

// HERE is a way to get all the Topics let refDB = FIRDatabase.database().reference(fromURL: firebaseDB_URL) let topicsRef = refDB.child("topics") // FIRDataSnapshot. topicsRef.observe(.value, with: { snapshot in if snapshot.value is NSNull { print("not found") } else { var loopCount = 1 // count loops to see how may time trying to loop for child in snapshot.children { print(" ") print(" ") print("child ------ loop /(loopCount)") let snap = child as! FIRDataSnapshot //each child is a snapshot if snap.value != nil { print("key ... /(snap.key)") let dict = snap.value as! [String: Any] // the value is a dictionary let name = dict["name"] as! String let description = dict["description"] as! String let createdBy = dict["createdBy"] as! String let tags = dict["tags"] as! NSArray /* Thought I could loop tags as! Dictionary but that does not work. Compiles but runtime crashes. var tagsArray = [String]() if tags != nil && tags.count > 0 { for (key, value) in tags { tagsArray.append(value) } } */ // Test to see what we got ... print("the bits ------") print("name .... /(name)") print("description .... /(description)") print("createdBy .... /(createdBy)") print("tags ... /(tags) ... count /(tags.count)") loopCount += 1 } else { print("bad snap") } } } })

Calculé la clave de tema del enlace de doc enviado por otra respuesta. Gracias.

No estoy seguro de obtener los valores de las etiquetas correctamente. Es solo un diccionario y traté de lanzarlo de esa manera, pero el tiempo de ejecución se bloquea y quiere lanzar etiquetas a un NSArray ... así que lo hice en el código y funciona, pero no estoy seguro si eso es seguro, ya que esto no es así. definido como una matriz a pesar de que está regresando como una matriz.



Se trata de diccionarios realmente.

Dado un nodo de ejemplo

people_foods -Yinasdjasjd name: "Leroy" food: "Pizza" -Yk9j9s9soks name: "Pete" food: "Wings"

Este código obtiene los datos como una instantánea y los repite para imprimir a la persona y sus alimentos.

let ref = self.myRootRef.child(byAppendingPath: "people_foods")! ref.observe(.value, with: { snapshot in if ( snapshot!.value is NSNull ) { print("not found") } else { for child in (snapshot?.children)! { let snap = child as! FDataSnapshot //each child is a snapshot let dict = snap.value as! [String: String] // the value is a dict let name = dict["name"] let food = dict["food"] print("/(name) loves /(food)") } } })

El nombre del nodo padre de cada hijo se puede encontrar con child.key también.

Un patrón de diseño típico es aprovechar una variedad de clases (o dicts o structs, etc.) como el dataSource para un tableView. Usted iteraría sobre los niños y crearía una clase para cada uno y la agregaría a tableView. Cuando se complete, tableView.reloadData para actualizar la interfaz de usuario.

También es importante recordar que Firebase es asíncrono, por lo que no intentes acceder o trabajar con esa matriz fuera del cierre Observe hasta que se complete el código.


Podrías hacerlo de la manera más fácil con mi SnapshotParser .

Necesitará el siguiente código para obtener una representación rápida:

func main(){ let topics=SnapshotParser().parseAsList(snap: Snapshot, type: Topic.self) for topic in topics{ //do something with your object } } class Topic: ParsableSnapshot { var id:String?=nil var createdBy:String?=nil var description:String?=nil var name:String?=nil var tags:[Int:String]?=nil required init(){} func bindProperties(binder: SnapshotParser.Binder) { binder.bindField(name: "id", field: &id) binder.bindField(name: "createdBy", field: &createdBy) binder.bindField(name: "description", field: &description) binder.bindField(name: "name", field: &name) binder.bindDictionary(name: "tags", dict: &tags) } }