DispatchGroup Не уведомляет «Main» в Swift - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь использовать группу рассылки, чтобы уведомить меня о завершении задачи. Я написал простое псевдо того, что я пытаюсь достичь. По какой-то причине моя функция уведомления вызывается первой.

    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 голосов
/ 18 сентября 2018

Вы не поняли, как работают группы рассылки. Вы звоните 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!
}

Вам нужно избавиться от этой причудливой структуры классов и собрать все вместе - группу диспетчеризации, вызовы enter и leave и блок notify - в одном месте. Если вы не хотите этого делать, тогда это нецелесообразное использование группы рассылки (возможно, вы хотели что-то вроде Operation и OperationQueue).

...