Geofire круг запроса. Получить значение один раз в базе данных Firebase в блоке запросов круга Geofire - PullRequest
0 голосов
/ 29 октября 2018

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


    }


}
...