Как мне постоянно опрашивать ближайших пользователей? - PullRequest
0 голосов
/ 01 июля 2019

Эти функции взяты из двух разных служебных файлов. В моем updateUserLocation я постоянно обновляю местоположение текущего пользователя и смотрю на функцию showClosestUser в Location Service. Я пытаюсь сделать запрос с радиусом 100 прямо сейчас (для тестирования, в идеале, меньше, чем радиус 5 или 10). Когда я добавляю точки останова, я вижу, что updateUserLocation непрерывно вызывается, но для функции showClosestUser код запускается до «myQuery? .Observe (.keyEntered, с: {(key, location) in») и не выполняет «UserService». .show (forUID: ключ, завершение: {(пользователь) в "коде? Я пытаюсь выяснить, не запрашивал ли пользователь? (верно), что это не текущий пользователь, поэтому я могу затем создать createNotification. Почему нет этот код выполняется?

static func updateUserLocation(location: CLLocation){
    var geoFireRef: DatabaseReference?
    var geoFire: GeoFire?

    geoFireRef = Database.database().reference().child("Geolocs")
    geoFire = GeoFire(firebaseRef: geoFireRef!)
    geoFire?.setLocation(location, forKey:(Auth.auth().currentUser?.uid)!)

    LocationService.showClosestUser { (user) in
        if user != nil {
            UserService.createNotification()
        }
   }
}

static func showClosestUser( completion: @escaping (User) -> ()){
    var geoFireRef: DatabaseReference?
    var geoFire: GeoFire?
    var myQuery: GFQuery?

    geoFireRef = Database.database().reference().child("Geolocs")

    geoFire = GeoFire(firebaseRef: geoFireRef!)

    let userLat = UserDefaults.standard.value(forKey: "current_latitude") as! String
    let userLong = UserDefaults.standard.value(forKey: "current_longitude") as! String

    let location:CLLocation = CLLocation(latitude: CLLocationDegrees(Double(userLat)!), longitude: CLLocationDegrees(Double(userLong)!))

    myQuery = geoFire?.query(at: location, withRadius: 100)

    myQuery?.observe(.keyEntered, with : { (key, location) in

        UserService.show(forUID: key, completion: { (user) in
            if let user = user {
                if (user.uid != User.current.uid){
                    completion(user)
                }
            }
            else {return}
        })
    })
}
...