Je crée une application utilisant l'API Google Adresses. J'ai actuellement un bouton qui, lorsqu'il est engagé, obtient l'adresse de l'emplacement GPS actuel. Le code est dans mon contrôleur de vue:Le gestionnaire d'achèvement d'échappement ne fonctionne jamais (API Google Adresses)
var placesClient: GMSPlacesClient?
@IBAction func buttonTapped(_ sender: AnyObject) {
placesClient?.currentPlace(callback: { (placeLikelihoods, error) -> Void in
guard error == nil else {
print("Current Place error: \(error!.localizedDescription)")
return
}
if let placeLikelihoods = placeLikelihoods {
let place = placeLikelihoods.likelihoods.first?.place
self.addressLabel.text = place?.formattedAddress!.components(separatedBy: ", ").joined(separator: "\n")
}
})
print("Out of the brackets...")
}
Lorsque vous avez terminé de cette façon, la fonction complète et « Sur les supports ... » est imprimé. Cependant, lorsque j'essaie de retirer ce code du contrôleur de vue et de l'appeler depuis le contrôleur de vue, comme ci-dessous, tout ce qui se trouve dans le bloc "placesClient? .currentPlace (callback) s'exécute (et récupère le bonne adresse), mais « Sur les supports ... » n'est imprimé et il ne retourne jamais la valeur:
class LocationAPIService {
var placesClient: GMSPlacesClient? = GMSPlacesClient.shared()
func getCurrentLocation() -> GMSPlace? {
var thisPlace: GMSPlace?
placesClient?.currentPlace(callback: { (placeLikelihoods, error) -> Void in
guard error == nil else {
print("Current Place error: \(error!.localizedDescription)")
return
}
if let placeLikelihoods = placeLikelihoods {
let place = placeLikelihoods.likelihoods.first?.place
thisPlace = place
}
})
print("Out of the brackets...")
return thisPlace
}
}
Quelqu'un sait pourquoi cela pourrait se produire
Vous ne pouvez pas « échapper gestionnaire d'achèvement ». Votre deuxième code n'a aucun sens. La ligne 'return thisPlace' va exécuter _before_ la ligne' thisPlace = place' a une chance d'être exécutée, donc 'thisPlace' sera toujours' nil' et vous renverrez toujours 'nil'. – matt