0

我尝试使用名为 getLocationForKey (Geofire) 的函数获取用户的位置。位置存储在 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 回答