swift - 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")
}
}
控制台输出:
我不明白。
解决方案
您也应该将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")
}
}
推荐阅读
- c - Eclipse CDT 索引器向符号添加不需要的引号
- azure-devops - 分支筛选器不适用于 Azure DevOps 中的构建完成触发器
- r - 使用 ggplot2 在 r 中为热图准备数据框
- python - 将 .fit 更改为 .fits 文件
- ios - 找不到 -lPods-项目名称的 iibrary
- css - 位置:绝对菜单卡在主体顶部,不在视口中
- python - 如何读取一次excel文件并持久保存结果
- node.js - 您可以传递 TypeORM 驱动程序级别的参数或为 TypeORM 提供预先创建的连接/池吗?
- reactjs - AWS AppSync GraphQL 我如何真正删除记录,而不仅仅是将“true”添加到 _deleted 列?
- sql - BizTalk WCF-SQL Insert 是否支持“NEXT VALUE FOR”(序列)