2017-01-31 2 views
0

Я использую Alamofire для одновременного выполнения нескольких асинхронных запросов и SwiftyJSON для обработки ответа.Асинхронный запрос (вопросы для заказа)

Мне нужна помощь, убедившись, что добавление к moviesByCategory происходит в порядке.

Например, «верхний» ответ данных должен быть первым элементом, добавленным к 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() 
    } 
} 
Смежные вопросы