Bonjour,L'utilisation completionHandler dans Alamofire Swift 2.2
Je suis en train d'utiliser completionHandler avec Alamofire à Swift 2.2 pour la première fois et je suis un peu perdu. Dans mon exemple, j'essaie de faire 3 appels API (API trakt.tv) mais je ne le fais pas correctement car il y a des valeurs manquantes dues à completionHandler.
Ma question est: Comment puis-je dire à ma fonction (avec un completionHandler) d'attendre que les 2 autres fonctions (getOverview et getPicture) soient exécutées? J'ai essayé d'utiliser un autre completionHandler dans les deux fonctions, mais cela n'a pas fonctionné.
C'est ma fonction:
func getMovies(url: String, clientID: String, completion : ([Movie]) ->()) {
let headers = ["trakt-api-version":"2", "Content-Type": "application/json", "trakt-api-key": clientID]
Alamofire.request(.GET, url, headers: headers).responseJSON { response in
if response.result.isSuccess {
let movieInfo = JSON(data: response.data!)
for result in movieInfo.arrayValue {
let slug = result["ids"]["slug"].stringValue
let title = result["title"].stringValue
let year = result["year"].stringValue
// OVERVIEW
self.getOverview(slug, clientID: clientID) { response in
print("Overview")
print(self.overview)
}
// PICTURE
self.getPicture(slug, clientID: clientID) { response in
print("Picture")
print(self.picture)
}
let movie = Movie(slug: slug, title: title, year: year, overview: self.overview, picture: self.picture)
print("Slug: "+slug)
print("Title: "+title)
print("Year: "+year)
// EMPTY
print("Overview: "+self.overview)
// EMPTY
print("Picture: "+self.picture)
self.movies.append(movie)
}
completion(self.movies)
} else {
print(response.result.error)
}
}
}
C'est mon appel:
getMovies(url, clientID: self.clientID) { response in
print(self.movies)
self.tableView.reloadData()
}
Et c'est ma fonction getOverview:
func getOverview(slug: String, clientID: String, completion : (String) ->()) {
let movieURL: String = "https://api.trakt.tv/movies/"+slug+"?extended=full"
let headers = ["trakt-api-version":"2", "Content-Type": "application/json", "trakt-api-key": clientID]
Alamofire.request(.GET, movieURL, headers: headers).responseJSON { response in
if response.result.isSuccess {
let movieInfo = JSON(data: response.data!)
self.overview = movieInfo["overview"].stringValue
completion(self.overview)
} else {
print(response.result.error)
}
}
}
Cordialement
Salut @ Welton122, je suis en train de changer mon code tu d'utiliser des groupes Dispatch mais puisque je ne les utilisais que je vais avoir beaucoup de problèmes. Pouvez-vous me montrer de la lumière? J'essaie de suivre quelques tutoriels et d'autres exercices par Stackoverflow mais je ne peux pas le faire correctement. Cordialement. –
Merci @ Welton122, j'ai utilisé Dispatch Groups et cela a finalement fonctionné. –