Vous essayez d'obtenir le nom d'une ville, tout en ayant la latitude et la longitude. A l'intérieur d'une classe de modèle Location
, j'utilise la fonction reverseGeocodeLocation(location: , completionHandler:)
fournie avec CLGeocoder (qui fait partie de CoreLocation).Récupérer des données à partir du gestionnaire d'exécution asynchrone
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)
}
})
}
Cependant, ViewController
, après l'exécution du getLocationName()
, le location.currentCity
est nil
, puisque le gestionnaire d'achèvement est async, et n'a pas été encore terminé.
Comment puis-je m'assurer que le gestionnaire de complétion a fini de fonctionner afin que je puisse accéder à location.currentCity
?
Juste accès 'location.currentCity' ** ** dans le gestionnaire d'achèvement ou ajouter un autre gestionnaire d'achèvement' getLocationName() 'pour retourner les données de manière asynchrone . – vadian
Vous ne "vérifiez pas que le gestionnaire de complétion a fini de tourner", vous faites juste ce que vous voulez faire avec 'location.currentCity' dans le' completionHandler' –
@vadian je dois accéder à 'location.currentCity' dans la vue contrôleur, (en dehors de la classe Location) pour mettre à jour l'interface utilisateur. Sera-t-il préférable d'ajouter un autre gestionnaire d'achèvement afin de ne pas mettre à jour l'interface utilisateur dans une classe de modèle? Pouvez-vous fournir un exemple de code indiquant comment ce nouveau gestionnaire de complétion doit être implémenté? –