2016-10-29 1 views
-1

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

+0

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

Répondre

0

le fixe Voici le code. J'ai utilisé pour la méthode dans ma classe LocationAPIService:

func setCurrentLocationPlace(completion: @escaping (_ result: Bool)->()) { 
    var placeFindComplete: Bool = false 

    placesClient?.currentPlace(callback: { (placeLikelihoods, error) -> Void in 
     guard error == nil else { 
      print("Current Place error: \(error!.localizedDescription)") 
      completion(true) 
      return 
     } 

     if let placeLikelihoods = placeLikelihoods { 
      let place = placeLikelihoods.likelihoods.first?.place 
      self.currentPlace = place 
      placeFindComplete = true 
      completion(true) 
     } 
    }) 
    if (placeFindComplete == false) { 
     completion(false) 
    } 
} 

Et voici la façon dont je l'ai appelé du contrôleur de vue:

locationAPIService?.setCurrentLocationPlace() { (locationFound) ->() in 
     if (locationFound == true) { 
//Run code here that triggers once setCurrentLocationPlace() complete. 
}