В классе модели Location
я получаю название текущего города:
var currentLatitude: Double!
var currentLongitude: Double!
var currentLocation: String!
var currentCity: String!
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)
}
self.nowUpdateUI()
})
}
В контроллере представления я хочу обновить пользовательский интерфейс и обновить свою метку, чтобы показать текущий город. Однако self.currentCity = city
происходит внутри замыкания. Итак, если я просто запускаю func в контроллере представления:
func updateUI() {
cityLbl.text = Location.sharedInstance.currentCity
}
- Я никуда не денусь, потому что закрытие еще не закончилось. Мне посоветовали добавить обработчик завершения в
getLocationName()
и внутри него выполнить вызов функции, которая будет обновлять пользовательский интерфейс. Однако из всех руководств по замыканиям, обработчикам завершения мне не ясно, как этого добиться. Как создать обработчик завершения, передать его в качестве аргументаgetLocationName()
и как вызватьgetLocationName
из контроллера представления?