DispatchGroup 未按预期工作

DispatchGroup doesn't work as expected

我做了 DispatchGroup 和 运行 2 个异步任务。一个在 main 上,另一个在 global().

据我了解,DispatchGroup.notify 的块应该在所有任务完成后调用,但它并不像我想的那样工作。

class Que {
    let group = DispatchGroup()

    init() {
        group.notify(queue: .main) {
        print("group done")
        }
    }

    func run() {
        doC()
        doD()
    }

    fileprivate func doC() {
        group.enter()
        DispatchQueue.main.async(group: group) {
            var rst = 0
            for idx in 0 ..< 500 {
                rst += idx
            }
            print("work item c is done")
            self.group.leave()
        }
    }

    fileprivate func doD() {
        group.enter()
        DispatchQueue.global().async(group: group) {
            var rst = 0
            for idx in 0 ..< 50 {
                rst += idx
            }
            print("work item d is done")
            self.group.leave()
        }
    }
}

结果是

work item d is done
group done
work item c is done

我想知道为什么不是

work item d is done
work item c is done
group done

如果我在 global() 队列上创建了 CD 任务 运行,它就成功了。

您将对 notify 的调用放在了错误的位置并且调用得太早了。

很可能您想在 run 方法结束时调用 notify

init() {
}

func run() {
    doC()
    doD()

    group.notify(queue: .main) {
        print("group done")
    }
}

请注意 notify 方法的文档中的内容:

Schedules a work item to be submitted to a queue when a group of previously submitted block objects have completed.

粗体是我的