我正在使用GeoFire并尝试仅获取3个满足某些条件的结果。这是我的情况,并不会阻止观察者。有数千个结果,我得到了所有结果,但我只需要3个结果。我基于this answer,但是如您所见,它在我的情况下不起作用。
请有人帮忙吗?
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文档中:
要取消地理位置查询的一个或所有回调,请致电
removeObserverWithFirebaseHandle:或removeAllObservers:
分别。
两者都不起作用。
最佳答案
引擎盖下的Geofire会触发Firebase数据库查询。一次性从Firebase检索所有结果,然后在本地触发每个结果的keyEntered
事件(或常规SDK的.childAdded
)。
调用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()
}
}
})
关于ios - GeoFire + Swift 3不能停止观察,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45179245/