单例派遣不等待其他组

时间:2018-07-11 21:52:15

标签: swift alamofire grand-central-dispatch

我试图等待我来自不同类的所有函数完成将数据追加到数组之前,然后继续。

我为dispath组创建了一个单例类。相反,当来自不同类的所有组都离开时,它会通知result(),它会单独执行。

class parralelRunner {
    let dispatchGroup = DispatchGroup()

    result(){
        dispatchGroup.notify(queue: .main) {
        print("All functions complete ")
    }
    }
}

class run1 {

    func start(){
        callAPI(){
            filterresult()
        }
    }

    callAPI(completion: (JSON)){
    Alamofire.request("url", headers: headers).responseJSON { response in
        if response.result.isSuccess{
            completion(JSON(response.result.value!))
        }else{
            print("Binance - Couldn't import Request: Please check your internet connection")
        }
    }
    }


    func filterresult(){
    parralelRunner.dispatchGroup.enter()
    for .... {

    }
    parralelRunner.dispatchGroup.leave()
    parralelRunner.result()
    }
}



class run2 {

    func start(){
        callAPI(){
            filterresult()
        }
    }

    callAPI(completion: (JSON)){
    Alamofire.request("url", headers: headers).responseJSON { response in
        if response.result.isSuccess{
            completion(JSON(response.result.value!))
        }else{
            print("Binance - Couldn't import Request: Please check your internet connection")
        }
    }
    }


    func filterresult(){
    parralelRunner.dispatchGroup.enter()
    for .... {

    }
    parralelRunner.dispatchGroup.leave()
    parralelRunner.result()
    }
}

1 个答案:

答案 0 :(得分:1)

parralelRunner.result()的调用只能被调用一次。并且在每个异步过程的开始都需要对enter进行调用,并在完成后相应地对leave进行调用。

您需要做的第一件事是将run1run2重构为类似这样的内容:

class run1 {
    func start(){
        parralelRunner.dispatchGroup.enter()
        callAPI(){ JSON in
            if let JSON = JSON {
                filterresult()
            }
            parralelRunner.dispatchGroup.leave()
        }
    }

    callAPI(completion: (JSON?)){
        Alamofire.request("url", headers: headers).responseJSON { response in
            if response.result.isSuccess{
                completion(JSON(response.result.value!))
            }else{
                print("Binance - Couldn't import Request: Please check your internet connection")
                completion(nil)
            }
        }
    }

    func filterresult() {
        for .... {

        }
    }
}

然后无论使用run1run2,您都需要类似以下内容:

run1.start()
run2.start()
parralelRunner.result()