在拥有纬度和经度的同时,尝试获取城市的名称。
在模型类Location
中,我使用了CLGeocoder(CoreLocation的一部分)附带的reverseGeocodeLocation(location: , completionHandler: )
func。
func getLocationName() {
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
guard let addressDict = placemarks?[0].addressDictionary else {
return
}
if let city = addressDict["City"] as? String {
self.currentCity = city
print(city)
}
if let zip = addressDict["ZIP"] as? String {
print(zip)
}
if let country = addressDict["Country"] as? String {
print(country)
}
})
}
但是,在ViewController
中,在运行getLocationName()
之后,location.currentCity
为nil
,因为完成处理程序是异步的,并且还没有完成。
如何确保完成处理程序已完成运行,以便我可以访问location.currentCity
?
答案 0 :(得分:3)
将一个闭包作为函数参数传递给你的getLocationName 你可以在reverseGeocodeLocation闭包内调用。
func updateLocation(currentCity : String) -> Void
{
print(currentCity)
}
func getLocationName(callback : @escaping (String) -> Void)
{
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
guard let addressDict = placemarks?[0].addressDictionary else {
return
}
if let city = addressDict["City"] as? String
{
self.currentCity = city
callback(city)
print(city)
}
if let zip = addressDict["ZIP"] as? String {
print(zip)
}
if let country = addressDict["Country"] as? String {
print(country)
}
})
}
在ViewController中......
getLocationName(callback: updateLocation)
答案 1 :(得分:0)
我将创建一个使用location.currentCity的函数,并从完成处理程序
中调用此函数因此,如果您的代码如下:
func foo() {
var location
getLocationName()
print(location.currentcity) // nil
}
将其更改为:
func foo() {
var location
getLocationName()
}
func bar() {
print(location.currentcity) // someplace
}
并从完成处理程序中调用bar()