2016-08-01 2 views
0

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

Répondre

1

Je voudrais utiliser des groupes Dispatch à solv e ce numéro. En utilisant ceux-ci, vous êtes en mesure d'attendre jusqu'à ce qu'un processus ou des processus soient terminés (avec un délai d'expiration). Voici un lien vers un article avec plus de détails.

http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/

+0

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. –

+0

Merci @ Welton122, j'ai utilisé Dispatch Groups et cela a finalement fonctionné. –