ios swift firebase geofire

ios - Consulta de GeoFire en la ubicación del usuario



swift firebase (3)

Para guardar todos sus registros que coinciden con la consulta, debe almacenar todos utilizando algo como:

var allKeys = [String:CLLocation]() circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in allKeys [key]=location }

y luego usa

circleQuery.observeReadyWithBlock({ print("All initial data has been loaded and events have been fired!") })

Soy bastante nuevo para trabajar con Firebase y su biblioteca de ubicaciones, GeoFire. Actualmente estoy enfrentando un problema al estructurar mis datos.

Por el momento mi DB es algo como esto:

users facebook:xxxxx displayName: xx firstName: xx lastName: xx location: g: xxxx l: 0: xxx 1: xxx facebook:yyyyy displayName: yy firstName: yy lastName: yy location: g: yyyy l: 0: yyy 1: yyy

Me gustaría consultar sobre los usuarios que están cerca de mi usuario actual con sesión iniciada. Para hacerlo, no puedo entender qué ruta de acceso debo especificar.

En este momento estoy haciendo esto (pero eso no funciona):

guardar la ubicación actual

let root = Firebase(url: "myapp.firebaseio.com") let usersRoot = root.childByAppendingPath("users") geoFire = GeoFire(firebaseRef: usersRoot.childByAppendingPath(root.authData.uid)) geoFire.setLocation(currentLocation, forKey: "location") { (error) in if (error != nil) { print("An error occured: /(error)") } else { print("Saved location successfully!") } }

recuperar otros usuarios cerca

let geoFire = GeoFire(firebaseRef: Firebase(url: "myapp.firebaseio.com").childByAppendingPath("users")) let query = geoFire.queryAtLocation(currentLocation, withRadius: radius) query.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in print("+ + + + Key ''/(key)'' entered the search area and is at location ''/(location)''") self.userCount++ self.refreshUI() })

ACTUALIZAR

guardar la ubicación actual

let root = Firebase(url: "myapp.firebaseio.com") geoFire = GeoFire(firebaseRef: root.childByAppendingPath("locations")) geoFire.setLocation(currentLocation, forKey: root.authData.uid) { (error) in if (error != nil) { print("An error occured: /(error)") } else { print("Saved location successfully!") } }

recuperar otros usuarios cerca

let geoFire = GeoFire(firebaseRef: Firebase(url: "myapp.firebaseio.com").childByAppendingPath("locations")) let query = geoFire.queryAtLocation(currentLocation, withRadius: radius) query.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in print("+ + + + Key ''/(key)'' entered the search area and is at location ''/(location)''") self.userCount++ self.refreshUI() })


Parece que hay un problema al configurar GFEventType. Eso se resolverá, parece en la próxima versión de GeoFire 1.3, por ahora puedes hacer esto ...

let geoFire = GeoFire(firebaseRef: ref) var allKeys = [String:CLLocation]() let query = geoFire.queryAtLocation(coordinates, withRadius: 0.2) print("about to query") query.observeEventType(GFEventType.init(0), withBlock: {(key: String!, location: CLLocation!) in print("Key: /(key), location /(location.coordinate.latitude)") allKeys [key] = location })

Como puede ver GFEventType.init (0) ... que se asigna a los tres tipos de enumeraciones que no están mapeadas correctamente en GeoFire en Swift por algún motivo.


Para GeoFire debe mantener un segmento en el árbol que contiene solo la geolocalización y luego tiene otro segmento en el árbol que contiene la otra información sobre los elementos.

user_locations uid1: g: xxxx l: 0: xxx 1: xxx uid2: g: xxxx l: 0: xxx 1: xxx user_profiles: uid1: name: "giacavicchioli" uid2: name: "Frank van Puffelen"

Ver también: consulta de datos de firebase vinculados a GeoFire