Ich verwende die neue Google Firebase-Datenbank in meiner iOS (Swift) -App.Wiederherstellen von Daten ohne Behandlung der gesamten Datenbank - Google Firebase/Swift
Wenn der Benutzer ein Konto erstellt, wird er der Datenbank mit einigen Parametern wie seinem Namen, seinem Alter und vor allem seinem aktuellen Standort (Längen-/Breitengrad) hinzugefügt.
Ich möchte die App andere Benutzer innerhalb XXkm um ihn herum finden.
habe ich die Testbenutzer wie folgt aus:
for index in 1...10 {
let profile: NSMutableDictionary = [
"username" : "User\(index)",
]
let parameters = [ // IT IS PARIS LOCATION
"latitude" : 48.856614,
"longitude" : 2.352222
]
self.ref.child("usersTest").child("userID:\(index)").child("profile").setValue(profile)
self.ref.child("usersTest").child("userID:\(index)").child("parameters").setValue(parameters)
}
Dies ist, wie ich vorgehen:
// MARK: GET RANDOM USER
refHandle = ref.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
// IN THE DATABASE, I MODIFY THE USER 1 TO BE MY OWN ACCOUNT,
// SO I CHANGE THE LOCATION TO BE DIFFERENT FROM THE OTHER
// USERS LOCATION
let ownUserID = "userID:1"
let usersDict = snapshot.value!["usersTest"] as! NSDictionary
let ownLatitude = usersDict[ownUserID]!["parameters"]!!["latitude"] as! CLLocationDegrees
let ownLongitude = usersDict[ownUserID]!["parameters"]!!["longitude"] as! CLLocationDegrees
let ownMaxDistance = usersDict[ownUserID]!["parameters"]!!["max_distance"] as! CLLocationDegrees
self.myLocation = CLLocation(latitude: ownLatitude, longitude: ownLongitude)
let usersID = usersDict.allKeys as! [String]
for index in 0...usersID.count - 1 {
let foundUserID = usersID[index]
if foundUserID != ownUserID {
let users = usersDict[foundUserID] as! NSDictionary
self.usersArray["user\(index)"] = users
let userParameters = self.usersArray["user\(index)"]!["parameters"] as! NSDictionary
let latitude = userParameters["latitude"] as! CLLocationDegrees
let longitude = userParameters["longitude"] as! CLLocationDegrees
let userLocation = CLLocation(latitude: latitude, longitude: longitude)
let distance = self.getDistance(userLocation, city2: self.myLocation)
if distance < ownMaxDistance {
print("The user is inside your radius")
} else {
print("The user is outside your radius")
}
}
}
})
// MARK: GET DISTANCE - FUNCTION
func getDistance(city1: CLLocation, city2: CLLocation) -> CLLocationDegrees {
let distance: CLLocationDistance = (city1.distanceFromLocation(city2))/1000
return distance
}
Das Problem mit dieser Art und Weise ist, dass die ganze Datenbank, da die App die Datenbank geladen werden geladen und dann überprüft, ob sich der gefundene Benutzer innerhalb oder außerhalb Ihres Radius befindet (ownMaxDistance).
Ich kann keine gefundenen Benutzer in aufsteigender Reihenfolge basierend auf der Entfernung zwischen dem gefundenen Benutzer und dem Benutzer klassifizieren.
Mit 100/200 Benutzern in der Datenbank gibt es kein Problem, aber wenn die Datenbank Tausende von Benutzern hält, wird es sehr lange dauern, alle Benutzer zu laden!
Danke für Ihre Hilfe!
UPDATE 1
klar zu sein, es ist ein Zunder wie app
Danke für Ihre Antwort, ich fand GeoFire, aber ich war sehr ärgerlich, als ich entdeckte, dass es nicht bereit für Firebase 3.0 ist, also kann ich es nicht für die verwenden Moment, ich möchte eine andere Lösung finden, aber ich finde es nicht. Vielleicht muss ich nur auf die Veröffentlichung der neuen GeoFire-Version warten? – fredericdnd
Ich weiß nicht, was ich sagen soll. Abhängig von Ihrer Deadline, auch wenn sie für Firebase 3.0 aktualisiert werden. Die andere Art, die funktionieren könnte, ist kompliziert, möglicherweise mit GPS-Koordinaten vom Typ "Ground Zero", für die Sie die Entfernung für jeden Benutzer berechnen (Standardbasiswert, ab dem gearbeitet werden kann). Mit diesem Wert können Sie dann versuchen, die Ergebnisse von Firebase basierend darauf zu filtern, wie nahe Personen an diesem GPS-Punkt sind. Es ist schwer zu erklären. –
Ich habe keine Frist, es ist ein persönliches Projekt, aber ich erkundige mich nach diesem "Ground Zero" Typ GPS oder warte einfach auf die Veröffentlichung der neuen GeoFire Version, danke;) – fredericdnd