所以Geofire文档说了这个:
地理查询可能会发生三种事件:
已输入密钥:密钥的位置现在与查询条件匹配。
密钥已退出:密钥的位置不再符合查询条件。
密钥已移开:密钥的位置已更改,但该位置仍符合查询条件。
但由于这些都是实时的,我该怎么做才能让它只查询一次,比如按下按钮,并存储密钥?我的locationManager.didUpdateLocations
看起来像这样:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
if String(describing: Date()) == String(describing: location.timestamp) {
var query = geoFire.queryAtLocation(location, withRadius: 10)
query.observe(.keyEntered, with: { (key, location) in
// Is this where I store the keys?
print("Key '\(key)' entered the search area and is at location '\(location)'")
})
manager.stopUpdatingLocation()
}
}
}
我试过这个,但回来的结果并不是决定因素。即使我的位置没有移动(在模拟器上),它有时会错过某些键或重复其他键。
答案 0 :(得分:1)
You can use ObserveReadyWithBlock:
知道何时加载了初始数据,然后取消查询。
添加一个观察者,一旦加载了所有初始GeoFire数据并且已为此查询触发了相关事件,就会调用该观察者。
以下是javascript中的示例,来自github上的similar discussion,但对iOS来说也是如此。
var items = []; // save the items
var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
console.log(key + " entered query at " + location + " (" + distance + " km from center)");
items.push(key);
});
geoQuery.on("ready", function() {
// This will fire once the initial data is loaded, so now we can cancel the "key_entered" event listener
onKeyEnteredRegistration.cancel();
});
但是逐个检索项目效率不高吗?
不是真的。 Firebase经过高度优化,可通过websockets保持持久连接。