我尝试使用名为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返回数据(通常在块内)之后对其进行处理。