2016-07-30 13 views
0

Ich benutze GeoFire, um einen bestimmten Radius zu suchen, den der Benutzer in meiner App einstellen und auf FireBase speichern kann. Wenn die Seite geladen wird, erhalte ich vor dem Ausführen der GeoFire-Abfrage den Radius von Firebase. Wenn ich den folgenden Code ausführe, erhalte ich den folgenden Fehler: Beenden der App aufgrund der nicht abgefangenen Ausnahme "NSInvalidArgumentException", Grund: "Die Genauigkeit muss kleiner als 23 sein!"Wie verwende ich einen gespeicherten Suchradius mit GeoFire richtig?

Durch das Herumspielen einiger strategisch platzierter print-Anweisungen sieht es so aus, als ob der searchRadius zum Zeitpunkt der Ausführung der GeoFire-Abfrage als 0 zurückkehrt, was mich vermuten lässt, dass asynchrones Laden im Spiel ist.

Meine Frage ist, bekomme ich diesen Fehler aufgrund meines searchRadius 0, und wenn ja, wie kann ich sicherstellen, dass der FireBase-Block, der den Suchradius meines Benutzers ergreift, vor meiner GeoFire-Abfrage läuft?

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeEventType(.Value, withBlock: { snapshot in 
     self.searchRadius = snapshot.value as! Double 
    }) 

    let center = CLLocation(latitude: 37.331469, longitude: -122.029825) 
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius) 



    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in 

     //Do code for each result returned 

    }) //End GeoFire query 

Antwort

0

Ja, dies ist ein asynchrones Ladeproblem. Auch wenn Firebase bereits den Wert searchRadius zwischengespeichert hat, wird der Wert Callback nicht inline ausgeführt. Der Thread wird die GeoFire-Abfrage einrichten, bevor der Wert aktualisiert wird.

Anhand dieses Codeausschnitts können Sie sicherstellen, dass der Radius vor dem Ausführen der Abfrage festgelegt wird, indem Sie den Abfragecode innerhalb des Rückrufs verschieben. Sie können auch ein einzelnes Ereignis beobachten, damit die Abfrage nicht erneut ausgeführt wird, wenn sich der Wert searchRadius ändert.

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeSingleEventOfType(.Value, withBlock: { snapshot in 
    self.searchRadius = snapshot.value as! Double 
    let center = CLLocation(latitude: 37.331469, longitude: -122.029825) 
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius) 
    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in 
     //Do code for each result returned 
    }) //End GeoFire query 
}) // End observeSingleEventOfType 
+0

Vielen Dank! Ihre Erklärung wird sehr geschätzt. –