Использование завершенияHandler в Alamofire Swift 2.2

Доброе утро,

Я впервые пытаюсь использовать завершениеHandler с Alamofire в Swift 2.2, и я немного потерялся. В моем примере я пытаюсь сделать 3 вызова API (API trakt.tv), но я делаю это неправильно, потому что есть некоторые пропущенные значения из-за завершенияHandler.

Мой вопрос: как я могу сказать своей функции (с завершениемHandler) ждать, пока не будут выполнены другие 2 функции (getOverview и getPicture)? Я попытался использовать другой завершениеHandler в обеих функциях, но это не сработало.

Это моя функция:

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)
            }
        }
    }

Это мой звонок:

getMovies(url, clientID: self.clientID) { response in
            print(self.movies)
            self.tableView.reloadData()
        }

И это моя функция 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)
        }
    }
}

С Уважением


person Jordi Gámez    schedule 01.08.2016    source источник


Ответы (1)


Я бы использовал Dispatch Groups для решения этой проблемы. Используя их, вы можете дождаться завершения процесса или процессов (с тайм-аутом). Вот ссылка на пост с более подробной информацией.

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

person Welton122    schedule 01.08.2016
comment
Привет @Welton122, я пытаюсь изменить свой код, чтобы использовать группы рассылки, но, поскольку я никогда их не использовал, у меня много проблем. Можете ли вы показать мне немного света? Я пытаюсь следовать некоторым руководствам и другим упражнениям по Stackoverflow, но не могу сделать это правильно. С Уважением. - person Jordi Gámez; 01.08.2016
comment
Спасибо @Welton122, я использовал Dispatch Groups, и это, наконец, сработало. - person Jordi Gámez; 01.08.2016