J'utilise DispatchGroup.enter() et leave() pour traiter la fonction asynchrone reverseG d'une classe auxiliaire. Le problème est clair, j'utilise l'objet mainViewController pour appeler dispatchGroup.leave() de mainViewControllers dans la classe helper! Y a-t-il un moyen de le faire?swift 3 DispatchGroup leave provoque des plantages quand il est appelé dans la fonction de classe auxiliaire
Le même code fonctionne lorsque reverseG est déclaré dans le contrôleur de la vue principale.
class Geo {
var obj = ViewController()
static func reverseG(_ coordinates: CLLocation, _ completion: @escaping (CLPlacemark) ->()) {
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(coordinates) { (placemarks, error) in
if let error = error {
print("error: \(error.localizedDescription)")
}
if let placemarks = placemarks, placemarks.count > 0 {
let placemark = placemarks.first!
completion(placemark) // set ViewController's properties
} else {
print("no data")
}
obj.dispatchGroup.leave() // ** ERROR **
}
}
}
Appel de fonction du contrôleur principal de vue
dispatchGroup.enter()
Geo.reverseG(coordinates, setValues) // completionHandler: setValues
dispatchGroup.notify(queue: DispatchQueue.main) {
// call another function on completion
}
Chaque appel 'leave' doit avoir un appel' enter' associé. Si vous appelez 'leave' sans avoir d'abord appelé' enter' Le problème ici est que vous appelez 'enter' sur un groupe, mais' reverseG' appelle 'leave' sur une autre instance de' ViewController'. Je suggère de passer le 'DispatchGroup' en tant que paramètre à votre méthode 'reverseG' ou, mieux,' reverseG' ne devrait pas quitter le groupe, mais plutôt mettre l'appel 'leave' dans le gestionnaire d'achèvement que' reserveG' appelle. – Rob
Exactement, déjà fait cela et cela a fonctionné. Merci –