Получение данных о местоположении с помощью 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, я хочу получить данные один раз и отобразить, а затем повторно получить данные с функцией «потянуть для обновления». Мой первый вопрос: есть ли у 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, я исправил предупреждения, однако он по-прежнему не попадает в закрытие.


person senty    schedule 17.05.2016    source источник


Ответы (1)


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

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

      }
    }
  }
person Gregg    schedule 18.05.2016
comment
Спасибо! Исправлены предупреждения. Но это не печать внутри крышки. Вы знаете почему? Я думал, что проблема в этой ошибке, но, видимо, нет. - person senty; 18.05.2016
comment
Изменить: это была моя ошибка. Попытка получить до получения основного местоположения. Огромное спасибо! - person senty; 18.05.2016
comment
Как вам удалось добавить . для ".indexOn"? Каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке, что не могу вставить . в качестве ключа - person KellysOnTop23; 06.08.2016