GeoFire 查询用户位置
GeoFire query on User location
我对使用 Firebase 及其位置库 GeoFire 还很陌生。目前我在构建数据时遇到了一些问题。
目前我的数据库是这样的:
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
我想查询我当前登录用户附近的用户。为此我无法理解必须指定的路径。
目前我正在这样做(但这不起作用):
正在保存当前位置
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!")
}
}
正在检索附近的其他用户
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()
})
更新
正在保存当前位置
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!")
}
}
正在检索附近的其他用户
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()
})
对于 GeoFire,您必须在树中保留一个仅包含地理位置的部分,然后在树中有另一个部分包含有关项目的其他信息。
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"
另见:Query firebase data linked to GeoFire
要保存与查询匹配的所有记录,您必须使用以下内容存储所有记录:
var allKeys = [String:CLLocation]()
circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: {
(key: String!, location: CLLocation!) in
allKeys [key]=location
}
然后使用
circleQuery.observeReadyWithBlock({
print("All initial data has been loaded and events have been fired!")
})
似乎在设置 GFEventType 时出现问题。这似乎会在下一个版本的 GeoFire 1.3 中得到解决,现在你可以这样做...
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
})
如您所见,GFEventType.init(0)... 由于某种原因映射到 Swift 中未正确映射到 GeoFire 的三种类型的枚举。
我对使用 Firebase 及其位置库 GeoFire 还很陌生。目前我在构建数据时遇到了一些问题。
目前我的数据库是这样的:
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
我想查询我当前登录用户附近的用户。为此我无法理解必须指定的路径。
目前我正在这样做(但这不起作用):
正在保存当前位置
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!")
}
}
正在检索附近的其他用户
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()
})
更新
正在保存当前位置
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!")
}
}
正在检索附近的其他用户
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()
})
对于 GeoFire,您必须在树中保留一个仅包含地理位置的部分,然后在树中有另一个部分包含有关项目的其他信息。
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"
另见:Query firebase data linked to GeoFire
要保存与查询匹配的所有记录,您必须使用以下内容存储所有记录:
var allKeys = [String:CLLocation]()
circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: {
(key: String!, location: CLLocation!) in
allKeys [key]=location
}
然后使用
circleQuery.observeReadyWithBlock({
print("All initial data has been loaded and events have been fired!")
})
似乎在设置 GFEventType 时出现问题。这似乎会在下一个版本的 GeoFire 1.3 中得到解决,现在你可以这样做...
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
})
如您所见,GFEventType.init(0)... 由于某种原因映射到 Swift 中未正确映射到 GeoFire 的三种类型的枚举。