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