GeoFire + Swift 3 观察停不下来
GeoFire + Swift 3 can't stop observing
我正在使用 GeoFire 并尝试仅获取 3 个满足某些条件的结果。这是我的情况,它不会阻止观察者。有数千个结果,我得到了所有结果,但我只需要 3 个。我基于 ,但如您所见,它在我的情况下不起作用。
有人可以帮忙吗?
var newRefHandle: FIRDatabaseHandle?
var gFCircleQuery: GFCircleQuery?
func findFUsersInOnePath(location: CLLocation,
radius: Int,
indexPath: String,
completion: @escaping () -> ()){
var ids = 0
let geofireRef = usersRef.child(indexPath)
if let geoFire = GeoFire(firebaseRef: geofireRef) {
gFCircleQuery = geoFire.query(at: location, withRadius: Double(radius))
newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in
// if key fit some condition
ids += 1
if (ids >= 3) {
self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!)
completion()
}
})
gFCircleQuery?.observeReady({
completion()
})
}
请不要介意 Optionals(?) 它仅用于此示例代码
来自 GoeFire 文档:
To cancel one or all callbacks for a geo query, call
removeObserverWithFirebaseHandle: or removeAllObservers:,
respectively.
两者都不工作。
引擎盖下的 Geofire 触发 Firebase 数据库查询。一次性从 Firebase 检索所有结果,然后在本地为每个结果触发 keyEntered
事件(或 .childAdded
用于常规 SDK)。
调用 removeObserver(withFirebaseHandle:
将阻止 Geofire 检索其他结果。但是对于已经检索到的任何结果,它仍会触发 keyEntered
。
解决方案是添加一个附加条件来忽略那些已经检索到的结果:
newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in
if (id <= 3) {
// if key fit some condition
ids += 1
if (ids >= 3) {
self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!)
completion()
}
}
})
我正在使用 GeoFire 并尝试仅获取 3 个满足某些条件的结果。这是我的情况,它不会阻止观察者。有数千个结果,我得到了所有结果,但我只需要 3 个。我基于
var newRefHandle: FIRDatabaseHandle?
var gFCircleQuery: GFCircleQuery?
func findFUsersInOnePath(location: CLLocation,
radius: Int,
indexPath: String,
completion: @escaping () -> ()){
var ids = 0
let geofireRef = usersRef.child(indexPath)
if let geoFire = GeoFire(firebaseRef: geofireRef) {
gFCircleQuery = geoFire.query(at: location, withRadius: Double(radius))
newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in
// if key fit some condition
ids += 1
if (ids >= 3) {
self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!)
completion()
}
})
gFCircleQuery?.observeReady({
completion()
})
}
请不要介意 Optionals(?) 它仅用于此示例代码
来自 GoeFire 文档:
To cancel one or all callbacks for a geo query, call removeObserverWithFirebaseHandle: or removeAllObservers:, respectively.
两者都不工作。
引擎盖下的 Geofire 触发 Firebase 数据库查询。一次性从 Firebase 检索所有结果,然后在本地为每个结果触发 keyEntered
事件(或 .childAdded
用于常规 SDK)。
调用 removeObserver(withFirebaseHandle:
将阻止 Geofire 检索其他结果。但是对于已经检索到的任何结果,它仍会触发 keyEntered
。
解决方案是添加一个附加条件来忽略那些已经检索到的结果:
newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in
if (id <= 3) {
// if key fit some condition
ids += 1
if (ids >= 3) {
self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!)
completion()
}
}
})