Я пытаюсь отследить местоположение других пользователей определенного приложения рядом с текущим пользователем, т.е.как убер.Я использую базу данных Firebase и делаю круговой запрос Geofire.
Когда запускается круговой запрос (когда перемещается местоположение другого пользователя), я хочу получить данные о местоположении другого пользователя.В идеале мне нужны полные данные CLLocation, т.е.координаты, скорость, курс другого пользователя, но, к сожалению, geofire отслеживает только данные координат другого пользователя.Поэтому я создал еще один узел Firebase с именем geoLocationCustom, который сохраняет другие данные CLLocation другого пользователя.
Когда я выполняю круговой запрос в моем приложении, он работает нормально и запускается один раз при каждом обновлении местоположения другого пользователя (см. первое печатное заявление).
Обработчику завершения передается ключевой параметр.Я хочу использовать этот ключ для запроса (один раз) базы данных Firebase для получения других данных о местоположении, которые я сохранил в своем пользовательском узле под тем же ключом, чтобы я мог перестроить CLLocation (с данными курса) для другого пользователя.Проблема заключается в том, что если я иду, чтобы прочитать другие данные с использованием наблюдающего единого события, я получаю данные обратно дважды, а не один раз во втором блоке завершения для каждого перемещения местоположения.Почему это происходит?И любые предложения о том, как мне лучше достичь своей цели: отслеживать местоположение других пользователей в непосредственной близости от этого пользователя и передавать полные данные CLLocation (включая курс) через Firebase, используя geoFire
private func trackIderLocations() {
// user loc known before this func called so can force unwap
let centre = userLocation!
// create geofire circle query
let circleQuery = geoFireRef.query(at: centre, withRadius: 10.0)
// call circle query
circleQuery.observe(.keyMoved) { (uid, location) in
print("circlequery loc:\(location)") // firing once per other user movement
// receiving database geoloc movement observations
// ignore current user geoloc observations
guard uid != self.ideeuid else { return }
// use the uid to get data in custom geolocation node saved for this user
self.geoLocCustomRef.child(uid).observeSingleEvent(of: .value, with: { (locationMeta) in
print("circle sub observe query:\(locationMeta)") // firing twice per other user movement
})
}
}