2016-03-26 5 views
0

Ich versuche, den Standort eines Benutzers mit einer Funktion namens GetLocationForKey (Geofire) zu erhalten. Der Standort ist in Firebase gespeichert. Ich nenne diese Funktion in func Tableview:Warum wurde GeoFires Funktion getLocationForKey überlagert?

// Get user Distance 
    var myLocation = CLLocation() 
    myLocation = getUserLocation(ref.authData.uid) 
    print("myLocation: [\(myLocation.coordinate.latitude), \(myLocation.coordinate.longitude)]") 

getUserLocation sieht wie folgt aus:

func getUserLocation(userID: String) -> CLLocation { 

    var userLocation = CLLocation() 
    print(userID) 

    let geoFire = GeoFire(firebaseRef: ref.childByAppendingPath("locations")) 
    geoFire.getLocationForKey(userID, withCallback: { (location, error) in 

     if (location != nil) 
     { 
      userLocation = CLLocation(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) 
      print("userLocation: [\(userLocation.coordinate.latitude), \(userLocation.coordinate.longitude)]") 
     } 
     else if (error != nil) 
     { 
      print("An error occurred getting the location for \(userID): \(error.localizedDescription)") 
     } 
     else 
     { 
      print("GeoFire does not contain a location for \(userID)") 
     } 
    }) 

    return userLocation 
} 

Als Ergebnis erhalte ich diese:

MyLocation: [0.0, 0.0]

userLocation: [123.456, 123.456]

das scheint mir seltsam, weil irgendwie der Code in getLo cationForKey wurde übersprungen, ich bekomme myLocation zuerst und danach userLocation. Weiß jemand warum? Jede Hilfe wird geschätzt, danke!

Antwort

0

Ich glaube, die Antwort ist, dass die getLocationForKey nicht übersprungen werden - „userLocation ... den Standort Druck

jedoch die print (“ es ausgeführt wird, wie durch Druck angezeigt (MyLocation ... Aussage (außerhalb des Blocks) auftritt, bevor der Code in getLocationForKey Zeit, um die Firebase Daten zurückgeben muss.

Denken Sie daran, dass Firebase asynchron ist so müssen Sie die Daten verarbeiten nach Firebase, dass die Daten zurückgibt, in der Regel innerhalb des Blocks.

+0

Danke, in Anbetracht der asynchronen Vernetzung Es ist wahrscheinlich keine gute Idee, getUserLocation in der tableview-Funktion aufzurufen, in der ich den Zellen Daten zuteile. Sonst würde ich "fataler Fehler: unerwartet gefunden Null beim Entpacken eines optionalen Wertes" erhalten. Wissen Sie vielleicht, wo/in welcher Funktion ich versuchen sollte, den Benutzerstandort abzurufen? – yoshimoshi

+0

@ yoshimoshi Ist dies eine Liste von Benutzern, die in einer Tabelle angezeigt wird, mit ihrem Namen und ihrer Position? – Jay

+0

Ja, das ist richtig, aber ich habe dieses Problem gelöst, indem ich alle notwendigen Informationen geladen habe, bevor ich diesen Viewcontroller geladen habe. Ist das der übliche Weg? – yoshimoshi

Verwandte Themen