2017-01-31 10 views
0

私はAlamofireを使用して多数の非同期リクエストを同時に実行し、SwiftyJSONを使用してレスポンスを処理しています。非同期リクエスト(注文事項)

私は、moviesByCategoryへの追加が順番に行われるように助けが必要です。

たとえば、「top_rated」データ応答は、「今後」ではなくmoviesByCategoryに追加される最初の要素である必要があります。

var moviesByCategory = [[JSON]]()  

override func viewDidLoad() { 
    super.viewDidLoad() 

    let apiEndPoints = ["top_rated", "popular", "now_playing", "upcoming"] 
    let dispatchGroup = DispatchGroup() 

    for endPoint in apiEndPoints { 
     let endPointURL = URL(string: "https://api.themoviedb.org/3/movie/\(endPoint)?api_key=\(apiKey)&language=en-US&page=1")! 
     dispatchGroup.enter() 
     getMoviesFromEndPoint(url: endPointURL) 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main) { 
     self.tableView.reloadData() 
    } 
} 

func getMoviesFromEndPoint(url: URL, group: dispatchGroup) { 
    Alamofire.request(url).responseData { response in 
     if let data = response.result.value { 
      let json = JSON(data: data) 
      self.moviesByCategory.append(json["results"].arrayValue) 
     } 
    } 
} 

DispatchGroupための目的は、すべての要求が完了したらUITableViewをリロードすることです。

これに関するお手伝いがあれば幸いです。私が間違っている箇所を指摘してください。

答えて

0

getMoviesFromEndPointに完了ハンドラのパラメータを追加します。

func getMoviesFromEndPoint(url: URL, completion:() -> Void) { ... } 

とネットワーク呼び出しが完了した後内のグループを残す:

getMoviesFromEndPoint(url: endPointURL) { 
    dispatchGroup.leave() 
} 

を完全なコード:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let apiEndPoints = ["top_rated", "popular", "now_playing", "upcoming"] 
    let dispatchGroup = DispatchGroup() 

    for endPoint in apiEndPoints { 
     let endPointURL = URL(string: "https://api.themoviedb.org/3/movie/\(endPoint)?api_key=\(apiKey)&language=en-US&page=1")! 
     dispatchGroup.enter() 
     getMoviesFromEndPoint(url: endPointURL) { 
      dispatchGroup.leave() 
     } 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main) { 
     self.tableView.reloadData() 
    } 
} 

func getMoviesFromEndPoint(url: URL, completion:() -> Void) { 
    Alamofire.request(url).responseData { response in 
     if let data = response.result.value { 
      let json = JSON(data: data) 
      self.moviesByCategory.append(json["results"].arrayValue)     
     } 
     completion() 
    } 
} 
関連する問題