Проблема в том, что ваш метод CLGeocoder
возвращает асинхронно, и к тому времени, когда он возвращает значение, ваш менеджер местоположения уже срабатывал несколько раз.Поэтому просто прекратите обновлять местоположения после первого вызова менеджера местоположений, а затем выполните асинхронную работу.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else {
return
}
// handle async work
CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
if let error = error {
// alert with error
} else if let placemarks = placemarks,
placemarks.count > 0 {
let placemark = placemarks[0]
var zipCode = placemark.postalCode ?? ""
makeHTTPRequest(zipCode)
} else {
print("No placemarks found.")
}
})
locationManager.stopUpdatingLocation() // stop updating
}
Кстати, это также хорошая практика - связывать ваши операторы if-else
.Если вы ведете с if
, вы почти всегда должны следовать за ним с else
вместо того, чтобы следовать с новым if
блоком.