ios - DispatchGroup 未按预期工作

标签 ios swift grand-central-dispatch

我创建了一个 DispatchGroup 并运行 2 个异步任务。一个位于 main 上,另一个位于 global() 上。

据我了解,一旦所有任务完成,就应该调用 DispatchGroup.notify 的 block ,但它并不像我想象的那样工作。

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

如果我让 CD 任务在 global() 队列上运行,它就会起作用。

最佳答案

您对 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.

粗体是我的。

关于ios - DispatchGroup 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45680872/

相关文章:

objective-c - 向应用程序添加自定义字体

ios - 在 iOS 中锁定一个 View 方向

c - 如何将一个很长的 C 宏桥接到 Swift?

swift - NSTitlebarAccessoryView 中 NSTextField 的 IBOutlet

swift - 在 Swift 4 中将数据转换为 DispatchData

objective-c - 如何使用 Grand Central Dispatch 启动一个异步调用?

ios - 点击链接时调用函数

ios - 创建宽度大于其表格的 UITableViewCell

ios - 实例成员不能用于类型 View Controller

ios - 等待异步方法在 for 循环中完成