GeoFire не показывает быстро введенный регион

Я столько недель пытался заставить его работать. Я читал документацию много раз, и, похоже, в Интернете нет примеров этого.

Цель: все, что я хочу сделать, это распечатать на консоли все сообщения, которые находятся в радиусе 10 км от местоположения текущего пользователя.

Проблемы: я действительно не понимаю, какие параметры нужно поместить в geoFire.setLocation местоположения пользователя или местоположение публикации. В документации показаны только координаты, введенные вручную. Я хочу вытащить свой из firebase и запросить его, когда пользователь окажется в пределах 10 км, они будут выведены на консоль. В настоящее время с кодом, который у меня нет, вообще ничего не печатается.

fileprivate func setupGeoFireLocation() {

    let ref = Database.database().reference(withPath: "posts")
    ref.observe(.childAdded, with: { (snapshot) in

        guard let dictionary = snapshot.value as? [String: Any] else { return }

        guard let latitude = dictionary["latitude"] as? String else { return }
        guard let longitude = dictionary["longitude"] as? String else { return }

        let postLat = (latitude as! NSString).doubleValue
        let postLon = (longitude as! NSString).doubleValue


        self.geoFire.setLocation(CLLocation(latitude: postLat, longitude: postLat), forKey: "posts")
        //Not quite sure what's meant to be the "forKey:" parameter.

})
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation: CLLocation = locations[0] as CLLocation

    ref = Database.database().reference()
    geoFire = GeoFire(firebaseRef: ref)

    let center = CLLocation(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
     let circleQuery = geoFire.query(at: center, withRadius: 10.0)
    _ = circleQuery.observe(.keyEntered, with: { (key, location) in
        print(key)
    })

    circleQuery.observeReady{
        print("All initial data has been loaded and events have been fired for circle query!")
    }
}

База данных Firebase


person user    schedule 06.11.2018    source источник
comment
Вы используете симулятор iOS?   -  person Artem    schedule 06.11.2018
comment
На моем физическом устройстве   -  person user    schedule 06.11.2018
comment
Нужно ли мне указывать местоположение, даже если координаты сохранены в моей базе данных? потому что это может быть проблема, которую я не использовал geoFire.setlocation @Artem   -  person user    schedule 06.11.2018
comment
Для работы GeoQueries вам действительно нужно указать местоположение в GeoFire. GeoFire запрашивает отдельное местоположение, где связывает ключи с геохешами информации о местоположении. Следуйте документации GeoFire по настройке местоположения для ключа, получение местоположения и запрос.   -  person Frank van Puffelen    schedule 06.11.2018


Ответы (1)


Из ваших комментариев кажется, что вы никогда специально не устанавливали информацию о местоположении с помощью метода setLocation GeoFire. Для работы GeoQueries вам действительно нужно указать местоположение в GeoFire. Это не будет просто работать с вашими существующими значениями широты и долготы.

GeoFire запрашивает отдельное местоположение, где связывает ключи с геохешами информации о местоположении. Следуйте документации GeoFire по настройке местоположения для ключа, получение местоположения и запрос.

Я также рекомендую прочитать эти вопросы, которые объясняют больше о GeoFire и о том, как он работает:

person Frank van Puffelen    schedule 06.11.2018
comment
Я прочитал документацию. Все еще не уверен. Мне нужно указать местоположение для размещения публикации или пользователей? и является ли ключ просто сообщениями, так как это имя моей базы данных? - person user; 06.11.2018
comment
GeoFire связывает ключ с местоположением. Ключ - это любое (строковое) значение, которое вы выберете. Если вы размещаете сообщение в каком-либо месте, вы должны использовать ключ сообщения (-L...). Если вы размещаете пользователя в каком-либо месте, используйте идентификатор пользователя (xgac...). Вы должны инициализировать GeoFire на ключе, которым он полностью управляет, чтобы он еще не содержал других данных. - person Frank van Puffelen; 06.11.2018