Получение данных о местоположении с помощью Radius с использованием Firebase & GeoFire

Я пытаюсь использовать GeoFire для получения и в соответствии с радиусом (например, все на расстоянии 10 км).

Для ясности, я сохраняю детали и местоположение отдельно в базе данных, поэтому идентификатор детали совпадает с идентификатором местоположения. Сохраняя данные, я использую:

 var details = ["a":"a", "b":"b", etc]
 let checkpointRef = eventRef.childByAutoId()
 checkpointRef.setValue(details)
 let checkpointId = checkpointRef.key

 let geofireRef = ref.childByAppendingPath("checkpointLocations")
 let geoFire = GeoFire(firebaseRef: geofireRef)

 geoFire.setLocation(CLLocation(latitude: usersLatitude, longitude: userLongitude), forKey: checkpointId) {...

До тех пор, пока здесь все в порядке в базе данных.


При получении данных, после получения широты и долготы пользователя из основного местоположения, я пытаюсь:

func retrieve() {
   let geofireRef = Firebase(url: self.baseurl + "/checkpointLocations")
   let geoFire = GeoFire(firebaseRef: geofireRef)

   let center = CLLocation(latitude: usersLatitude, longitude: usersLongitude)

   var circleQuery = geoFire.queryAtLocation(center, withRadius: 10)

   circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in
        print("Key '\(key)' entered the search area and is at location '\(location)'")
    })

Первая проблема возникает здесь с observeEventType(), Я не хочу наблюдать за происходящим постоянно. Вместо этого, как и в случае с классическим TableView, я хочу получить данные один раз и отобразить, а затем повторно получить данные с помощью функции "pull to refresh". Мой первый вопрос: есть ли какая-нибудь функция, чтобы GeoFire работал как observeSingleEventOfType Firebase и получить данные один раз?


Во-вторых, эта функция печатает это предупреждение пару раз:

[Firebase] Использование неуказанного индекса. Для повышения производительности рассмотрите возможность добавления ".indexOn": "g" в /checkpointLocations к вашим правилам безопасности.

..но больше ничего не регистрируется. Я не думаю, что это идет внутри функции, потому что она не печатает print("Key.. часть. Это также не print("A"),

Я думал, что это может быть вызвано "Правилами Firebase". Используя этот ответ на SO, я попытался добавить это:

 "rules": {
    "checkpointLocations": {
      "$key": {
        ".read": true,
        ".write": true,
        "geofire": {
          ".indexOn": "g"
        }
      }
    }
  }

а также это:

 "rules": {
    "checkpointLocations": {
      ".read": true,
      ".write": true,
      "geofire": {
        ".indexOn": "g"
      }
    }
  }

Но ни один не работает.

Обновить:

Используя ответ @Gregg, я исправил предупреждения, однако они по-прежнему не входят в замыкание.

1 ответ

Решение

Недостаточно точек для комментариев, но переместите ".indexOn" вверх к узлу checkpointLocations. В настоящее время он у вас есть на checkpointLocations/geofire. Например:

"rules": {
    "checkpointLocations": {
      ".read": true,
      ".write": true,
      ".indexOn": "g"
      "geofire": {

      }
    }
  }
Другие вопросы по тегам