Я пытаюсь использовать 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, я исправил предупреждения, однако он по-прежнему не попадает в закрытие.