Asynchronous 异步请求(订单事项)

Asynchronous 异步请求(订单事项),asynchronous,swift3,grand-central-dispatch,alamofire,Asynchronous,Swift3,Grand Central Dispatch,Alamofire,我使用Alamofire并发执行大量异步请求,并使用SwiftyJSON处理响应 我需要帮助确保按类别添加到moviesbycography 例如,“排名靠前”的数据响应应该是附加到moviesByCategory的第一个元素,而不是“即将到来” DispatchGroup的目的是在所有请求完成后重新加载UITableView 对此,我们将不胜感激。请指出我的错误所在。将完成处理程序参数添加到getMoviesFromEndPoint: func getMoviesFromEndPoint(ur

我使用
Alamofire
并发执行大量异步请求,并使用
SwiftyJSON
处理响应

我需要帮助确保按类别添加到
moviesbycography

例如,“排名靠前”的数据响应应该是附加到
moviesByCategory
的第一个元素,而不是“即将到来”

DispatchGroup
的目的是在所有请求完成后重新加载
UITableView


对此,我们将不胜感激。请指出我的错误所在。

将完成处理程序参数添加到
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()
    }
}
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()
    }
}