Вот как я думаю, что это должно быть сделано:
1 Сделайте снимок всех записей о долготе и широте всех пользователей в Firebase - распечатайте их в поле вывода, чтобы проверить этот шаг.
2.1 Назовите функцию для расчета расстояния между вошедшим в систему пользователем и всеми другими пользователями
2.2 Внутри этой функции make let координата₀ = зарегистрированные в системе координаты пользователя.База данных имеет строковое значение координат, так что каким-то образом это нужно сделать в CLLLoationDegrees.
2.3 Сделать цикл для координаты1 до координаты X (т.е. всех пользователей в базе данных) для их координат
2.4. Использовать let distanceInMeters = координата₀.distance (от: координата₁) и цикл для всех расстояний до координаты X (последней в базе данных)
2.5 Вывести все расстояния в поле вывода.(Мне не нужно, чтобы они печатались в приложении, я просто получаю расстояния, чтобы я мог ранжировать пользователей по расстоянию)
The Database looks like this for each kid:
"people" : {
"2jWm6rUfZVYAGkSST0fvVvwolY92" : {
"Coordinates" : {
"latitude" : 45.785834,
"longitude" : -100.406417
},
"Education" : "BA Arts",
"PhotoPosts" : "https://firebasestorage.googleapis.com/v0/b/westpluto1.appspot.com/o/images%2FPhotoPosts?alt=media&token=ccd5a139-b3e1-4ac9-965c-2f09c149fc74",
"users" : "jackmaster1091@aol.com"
},
///Part A
var refArtists : DatabaseReference!
var people = [Userx]()
var latestLocation: [String: Double]? ////this double was added to get coordinates into firebase under longitude and latitude
/// Часть B
let thisUsersUid = Auth.auth().currentUser?.uid //Mr. Dunn's uid
refArtists = Database.database().reference().child("people");
refArtists.observe(DataEventType.value, with: {snapshot in
if snapshot.childrenCount>0{
self.people.removeAll()
for people in snapshot.children.allObjects as! [DataSnapshot] {
if people.key != thisUsersUid { //do not add this users info to the array
let peopleObject = people.value as? [String: AnyObject]
let peopleCoordinates = peopleObject?["Coordinates"] as? String
let peopl = Userx(Coordinates: peopleCoordinates)
self.people.append(peopl)
}
self.table.reloadData()
print(snapshot)
}
}
})
/// Часть C
func distance (){
let databaseRef = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
let coordinate₀ = CLLocation(latitude: databaseRef.child("people").child(uid).child("Coordinates").child("latitude"), longitude: databaseRef.child("people").child(uid).child("Coordinates").child("longitude")) //////I think this is incorrect even w/o string to CLL conversion because I don’t think longitude and latitude and technically children of Coordinates
…..
let distanceInMeters = coordinate₀.distance(from: coordinate₁)
let distanceInMeters2 = coordinate₀.distance(from: coordinate2)
….
Print …
Print …
/////// Код, основанный на ответе от Джея
let uid = Auth.auth().currentUser!.uid
let ref = Database.database().reference().child("people").child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allCoordinates = snapshot.children.allObjects as! [DataSnapshot]
for Coordinates in allCoordinates {
let lat = Coordinates.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = Coordinates.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let userId = Coordinates.key
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let bcoordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
}
})
/// 2-й обновленный код:
let uid = Auth.auth().currentUser!.uid
refArtists = Database.database().reference().child("people");
let ref = self.refArtists.child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allLocations = snapshot.children.allObjects as! [DataSnapshot]
for location in allLocations {
let userId = location.key
let coordSnap = location.childSnapshot(forPath: "Coordinates")
let lat = coordSnap.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = coordSnap.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
print(" coords: \(lat) \(lon)")
}
})
//// Это код, который теперь дает две напечатанные координаты:
let ref = self.refArtists.child(uid).child("Coordinates")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allLocations = snapshot.children.allObjects as! [DataSnapshot]
for location in allLocations {
let userId = location.key
let lat = snapshot.childSnapshot(forPath: "latitude").value as! CLLocationDegrees
let lon = snapshot.childSnapshot(forPath: "longitude").value as! CLLocationDegrees
let locCoord = CLLocationCoordinate2DMake(lat, lon)
let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: lon)
print(" coords: \(lat) \(lon)")
}
Я рассчитываю ранжировать пользователей по местоположению после всего этого.