我尝试使用名为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
}


结果,我得到这个:

myLocation:[0.0,0.0]

userLocation:[123.456、123.456]

这对我来说似乎很奇怪,因为以某种方式跳过了getLocationForKey中的代码,因此我首先获得了myLocation,然后才获得了userLocation。有人知道为什么吗?任何帮助表示赞赏,谢谢!

最佳答案

我相信答案是getLocationForKey不会被跳过-它正在执行,如print(“ userLocation ... print location)所示。

但是,在getLocationForKey中的代码有时间返回Firebase数据之前,将发生print(“ myLocation ...”语句(位于块外部)。

请记住,Firebase是异步的,因此您需要在Firebase返回数据(通常在块内)之后对其进行处理。

07-27 13:40