首页 > 解决方案 > Swift:Simple DispatchQueue 无法正确运行和通知

问题描述

我做错了什么?在操场上它应该运行。但是一旦我在 iOS 模拟器上部署它,它就会返回错误的序列。

@objc func buttonTapped(){

    let group = DispatchGroup()
    let dispatchQueue = DispatchQueue.global(qos: .default)

    for i in 1...4 {
        group.enter()
        dispatchQueue.async {
            print(" \(i)")  
        }
        group.leave()
    }

    for i in 1...4 {
        group.enter()
        dispatchQueue.async {
            print("❌ \(i)")
        }
        group.leave()
    }

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

控制台输出:

ios模拟器 操场

我不明白。

标签: swiftgrand-central-dispatch

解决方案


您也应该将group.leave()语句放在dispatchQueue.async块中,否则它将在异步块完成执行之前同步执行。

@objc func buttonTapped(){

    let group = DispatchGroup()
    let dispatchQueue = DispatchQueue.global(qos: .default)

    for i in 1...4 {
        group.enter()
        dispatchQueue.async {
            print(" \(i)")  
            group.leave()
        }
    }

    for i in 1...4 {
        group.enter()
        dispatchQueue.async {
            print("❌ \(i)")
            group.leave()
        }
    }

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

推荐阅读