Получение данных о местоположении с помощью 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": {
}
}
}