0

getLocationForKey (Geofire) という関数を使用して、ユーザーの位置を取得しようとしています。Location は Firebase に保存されます。この関数を func tableview で呼び出します。

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

getUserLocation は次のようになります。

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
}

その結果、私はこれを得る:

私の場所: [0.0, 0.0]

ユーザーの場所: [123.456, 123.456]

どういうわけか getLocationForKey のコードが飛び越えたので、私には奇妙に思えます。最初に myLocation を取得し、その後で userLocation を取得します。誰かが理由を知っていますか?どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

0

答えは、 getLocationForKey が飛び越えていないことだと思います- print("userLocation... 場所を印刷しています。

ただし、getLocationForKey のコードが Firebase データを返す前に、print("myLocation... ステートメント (ブロックの外側) が発生しています。

Firebase は非同期であるため、 Firebase がデータを返した、通常はブロック内でデータを処理する必要があることに注意してください。

于 2016-03-27T13:45:28.637 に答える