使用geofire进行一次性位置更新?迅速4

时间:2018-03-29 23:41:47

标签: ios swift firebase swift4 geofire

所以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()
        }
    }
}

我试过这个,但回来的结果并不是决定因素。即使我的位置没有移动(在模拟器上),它有时会错过某些键或重复其他键。

1 个答案:

答案 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保持持久连接。