2016-06-02 23 views
1

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

Antwort

1

helfen könnte, fand ich die Lösung! Früher habe ich die alte Version von Firebase (2.5.1) GeoFire installieren, kann ich nicht Cocoapods verwendet habe, habe ich installierte alle Frameworks manuell mit einem Brückenkopf

Verbindung der alten Firebase: https://www.firebase.com/docs/ios/

Fragen wenn Sie Probleme mit der Installation der Frameworks haben;)

0

Da Sie bereits Firebase verwenden. Ich denke, du könntest das benutzen. Es heißt GeoFire. Es ist ein Addon zu Firebase. Am wahrscheinlichsten wäre der schnellste/einfachste Weg, vorwärts zu gehen.

https://firebase.googleblog.com/2013/09/geofire-location-queries-for-fun-and.html https://github.com/firebase/geofire-objc

auch eine Frage auf, dass hier auch GeoFire query on User location

+0

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

+0

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. –

+0

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