【问题标题】:Asynchronous Request (Order Matters)异步请求(顺序事项)
【发布时间】:2017-01-31 04:10:53
【问题描述】:

我使用Alamofire 并发执行多个异步请求,并使用SwiftyJSON 处理响应。

我需要帮助确保附加到 moviesByCategory 的顺序发生。

例如,“top_rated”数据响应应该是附加到moviesByCategory 的第一个元素,而不是“upcoming”。

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

对此的任何帮助将不胜感激。请指出我错在哪里。

【问题讨论】:

    标签: asynchronous swift3 grand-central-dispatch alamofire


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多