在Swift中DispatchGroup不会通知'Main'

时间:2018-09-18 03:16:36

标签: swift grand-central-dispatch

我正在尝试使用Dispatch组在任务完成运行时通知我。我已经写了一个我想完成的简单伪指令。由于某种原因,我的notify函数首先被调用。

    class Main {
        let cats = Cats()
        let all = ALL.singleton

        viewdidLoad(){
            cats.makeAllCall
            all.dis()
        }
    }


    class Cats {
    let dispatch = DispatchGroup()
    let all = ALL.singleton

    func makeAllCall(){
        for i in 1...10{
        all.callInfo()
        print("hello")
        }
    }
    }

    class ALL {
    static let singleton = ALL()
    let dispatch = DispatchGroup()

    func dis(){
        dispatch.notify(.main){
            print("working")
        }
    }

    func callInfo(){
        dispatch.enter()
    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")
            }
        }
        dispatch.leave()
        }
    }

1 个答案:

答案 0 :(得分:1)

您还不了解调度组的工作方式。您正在呼叫dis(),显然是相信dispatch.notify是您所称的东西。不是。当每个enter被一个leave平衡后,就会为您调用。一个典型的结构看起来像这样的伪代码:

let group = DispatchGroup()
// here we go...
group.enter()
_queue1_.async {
    // ... do task here ...
    group.leave()
}
group.enter()
_queue2_.async {
    // ... do task here ...
    group.leave()
}
group.enter()
_queue3_.async {
    // ... do task here ...
    group.leave()
}
// ... more as needed ...
group.notify(queue: DispatchQueue.main) {
    // finished!
}

您需要摆脱这种奇怪的类结构,并将所有东西(调度组,enterleave调用以及notify块)放在一个地方。如果您不想这样做,那么这不是对调度组的好用(也许您想要的是像Operation和OperationQueue这样的东西)。