Ios 等待多个Alamofire请求完成

Ios 等待多个Alamofire请求完成,ios,swift,alamofire,Ios,Swift,Alamofire,我在我的网络类中有一个下面的函数,它执行Alamofire请求过程。我在我的模型类中调用这个函数,当Alamofire完成请求时,它调用委托函数,该函数通知模型类。我的问题是我多次调用这个Alamofire函数,两个函数都应该在通知模型类之前完成。现在我用非常愚蠢的方式处理它。当我搜索时,可以使用DispatchGroup,但我不知道如何实现它。多谢各位 模范班 @objc func refresh_fiks(){ let network = Network() network

我在我的网络类中有一个下面的函数,它执行Alamofire请求过程。我在我的模型类中调用这个函数,当Alamofire完成请求时,它调用委托函数,该函数通知模型类。我的问题是我多次调用这个Alamofire函数,两个函数都应该在通知模型类之前完成。现在我用非常愚蠢的方式处理它。当我搜索时,可以使用DispatchGroup,但我不知道如何实现它。多谢各位

模范班

 @objc func refresh_fiks(){
    let network = Network()
    network.delegate = self
    self.teams = [[]]
    network.getRequest(req: 1)
    network.getRequest(req: 2)

}
请求功能:

    func response(){
    print(response_json.count)
    if(response_json.count == path){
        self.delegate?.sendJson(response_json)
    }
    }
    func getRequest(req: Int) {
    path = req
    let rot = Router(method: .get, path: req, parameters: nil)
    Alamofire.request(rot)
        .response { response in
            print(response.request?.url! as Any)
            // check for errors
            guard response.error == nil else {
                // got an error in getting the data, need to handle it
                print(response.error!)
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                self.response_json.append(errorJson)
                self.response()
                return
            }
            // make sure we got some JSON since that's what we expect
            guard (response.data?.base64EncodedString()) != nil else {
                print("Error: \(String(describing: response.error))")
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                self.response_json.append(errorJson)
                self.response()
                return
            }
            guard response.response?.statusCode == 200 else{
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                self.response_json.append(errorJson)
                self.response()
                return
            }
            let json = JSON(data: response.data!)
            // get and print the title
            if json != nil{
                self.response_json.append(json)
                self.response()
            } else {
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                self.response_json.append(errorJson)
                self.response()
                return
            }
    }
}

我对您的代码做了一些更改:

网络类:

func response(array: [JSON]){
    print(array.count)
    if(array.count == path){
        self.delegate?.sendJson(array)
    }
}

func getMultipleRequests(_ requests: [Int]) {
    DispatchQueue.global(qos: .background).async {
        let group = DispatchGroup()

        var array: [JSON] = []

        for request in requests {

            group.enter()

            self.getRequest(req: request, completion: { (json) in
                array.append(json)
                group.leave()
            })
        }

        group.wait()
        //this line below won't be called until all entries will leave the group
        self.response(array: array)
    }
}

func getRequest(req: Int, completion: @escaping (_ json: JSON) -> Void) {
    path = req
    let rot = Router(method: .get, path: req, parameters: nil)
    Alamofire.request(rot)
        .response { response in
            print(response.request?.url! as Any)
            // check for errors
            guard response.error == nil else {
                // got an error in getting the data, need to handle it
                print(response.error!)
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            // make sure we got some JSON since that's what we expect
            guard (response.data?.base64EncodedString()) != nil else {
                print("Error: \(String(describing: response.error))")
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            guard response.response?.statusCode == 200 else{
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            let json = JSON(data: response.data!)
            // get and print the title
            if json != nil{
                completion(json)
            } else {
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
    }
}
因此getRequest函数现在有一个完成块,它将返回每个请求的json结果,而getMultipleRequests函数将接收来自任何人的一组请求

这就是你如何使用它

您的类,称为refresh_fiks:

@objc func refresh_fiks(){
    let network = Network()
    network.delegate = self
    self.teams = [[]]

    network.getMultipleRequests([1,2])
}
另外,您可能需要使用group.notify,而不是使用group.wait,最好是通知所有条目都离开指定队列中的组,如main:

有关DispatchGroup的阅读内容:


我对您的代码做了一些更改:

网络类:

func response(array: [JSON]){
    print(array.count)
    if(array.count == path){
        self.delegate?.sendJson(array)
    }
}

func getMultipleRequests(_ requests: [Int]) {
    DispatchQueue.global(qos: .background).async {
        let group = DispatchGroup()

        var array: [JSON] = []

        for request in requests {

            group.enter()

            self.getRequest(req: request, completion: { (json) in
                array.append(json)
                group.leave()
            })
        }

        group.wait()
        //this line below won't be called until all entries will leave the group
        self.response(array: array)
    }
}

func getRequest(req: Int, completion: @escaping (_ json: JSON) -> Void) {
    path = req
    let rot = Router(method: .get, path: req, parameters: nil)
    Alamofire.request(rot)
        .response { response in
            print(response.request?.url! as Any)
            // check for errors
            guard response.error == nil else {
                // got an error in getting the data, need to handle it
                print(response.error!)
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            // make sure we got some JSON since that's what we expect
            guard (response.data?.base64EncodedString()) != nil else {
                print("Error: \(String(describing: response.error))")
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            guard response.response?.statusCode == 200 else{
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
            let json = JSON(data: response.data!)
            // get and print the title
            if json != nil{
                completion(json)
            } else {
                let errorJson: JSON = [ "Error" : "Can't get the data!"]
                completion(errorJson)
                return
            }
    }
}
因此getRequest函数现在有一个完成块,它将返回每个请求的json结果,而getMultipleRequests函数将接收来自任何人的一组请求

这就是你如何使用它

您的类,称为refresh_fiks:

@objc func refresh_fiks(){
    let network = Network()
    network.delegate = self
    self.teams = [[]]

    network.getMultipleRequests([1,2])
}
另外,您可能需要使用group.notify,而不是使用group.wait,最好是通知所有条目都离开指定队列中的组,如main:

有关DispatchGroup的阅读内容: