GeoFire Swift 3 — Сохранение и обновление координат

Я пытаюсь сохранить координаты в базе данных Firebase с помощью GeoFire.

Я не уверен, как обновить новые координаты, так как они будут меняться/обновляться каждую секунду. С помощью childByAutoId он генерирует новый уникальный идентификатор для каждого велосипеда.

Как мне сослаться на этот уникальный идентификатор велосипеда? Например, пользователю будет звонить FIRAuth.auth()?.currentUser?.uid. Это возможно?

 let geofireRef = FIRDatabase.database().reference().child("Bike").childByAutoId()
 let geoFire = GeoFire(firebaseRef: geofireRef)

 var data = geoFire?.setLocation(CLLocation(latitude: userIncrementLat, longitude: userIncrementLong), forKey: "BikeId")

Моя структура базы данных Firebase будет выглядеть так...

 Root
 1. Bike
 2.  UniqueUID Number (Firebase)
 3.   BikeId
 4.    g
       l
 5.     0:
        1:

person S.MacPherson    schedule 27.09.2016    source источник
comment
Также как значения будут получены? Я просто изо всех сил пытаюсь понять, как бы я назвал этот уникальный идентификатор.   -  person S.MacPherson    schedule 27.09.2016


Ответы (1)


Это моя структура базы данных Firebase для обновления местоположения пользователей по времени и извлечения ближайших пользователей для отображения на карте:

db-root
"users" : {
    <userUID> : {
        "someKey" : "someValue",
        ...
    }
}
"users_location" : {
    <userUID> : {
        <geofireData> ...
    }
}

Вары для использования:

let ref = FIRDatabase.database().reference()
let geoFire = GeoFire(firebaseRef: ref.child("users_location"))

Чтобы обновить зарегистрированное местоположение пользователя:

func updateUserLocation() {

    if let myLocation = myLocation {

        let userID = FIRAuth.auth()!.currentUser!.uid
        geoFire!.setLocation(myLocation, forKey: userID) { (error) in
            if (error != nil) {
                debugPrint("An error occured: \(error)")
            } else {
                print("Saved location successfully!")
            }
        }

    }
}

Чтобы найти ближайшего пользователя, я использую функцию findNearbyUsers. Полезно найти ближайших пользователей и сохранить в массиве nearbyUsers ключ UID пользователей. Функция observeReady выполняется после завершения запроса и использует UID для получения сведений о пользователях (я использую это, чтобы показать сведения о пользователях на карте).

func findNearbyUsers() {

    if let myLocation = myLocation {

        let theGeoFire = GeoFire(firebaseRef: ref.child("users_location"))
        let circleQuery = theGeoFire!.query(at: myLocation, withRadius: radiusInMeters/1000)

        _ = circleQuery!.observe(.keyEntered, with: { (key, location) in

            if !self.nearbyUsers.contains(key!) && key! != FIRAuth.auth()!.currentUser!.uid {
                self.nearbyUsers.append(key!)
            }

        })

        //Execute this code once GeoFire completes the query!
        circleQuery?.observeReady({

            for user in self.nearbyUsers {

                self.ref.child("users/\(user)").observe(.value, with: { snapshot in
                    let value = snapshot.value as? NSDictionary
                    print(value)
                })
            }

        })

    }

}

Надеюсь, поможет

person andreapavan    schedule 14.10.2016
comment
Привет, а что, если я хочу показать пользователя, а не данные о пользователе? Спасибо - person John; 11.02.2017