为什么在第一个任务退出后调用 dispatchGroup.notify ?



为什么在第一个任务退出后调用 dispatchGroup.notify ?

在下面的代码中,输出如下所示:

1) Did the other thing 
**2) Did all the things** 
3) Did one thing 
4) done waiting

我期望:

1) Did the other thing 
2) Did one thing 
3) done waiting
**4) Did all the things** 

DispatchQueue.global().async {
let dispatchGroup = DispatchGroup()
dispatchGroup.notify(queue: DispatchQueue.main) {
print("Did all the things")
}

dispatchGroup.enter()
DispatchQueue.global().asyncAfter(deadline: .now() + 10) {
print("Did one thing")
dispatchGroup.leave()
}

dispatchGroup.enter()
DispatchQueue.global().async {
print("Did the other thing")
dispatchGroup.leave()
}
dispatchGroup.wait()
print("done waiting")
}

作为旁注,如果我在主线程上执行此操作,它会按预期工作。

根据非常小的苹果文档: https://developer.apple.com/documentation/dispatch/dispatchgroup

func notify(queue: DispatchQueue, work: DispatchWorkItem( 计划在一组以前提交的块对象完成时将工作项提交到队列。

在上面的示例中,我在将块提交到队列之前调用dispatchQueue.通知。通过按如下方式更新代码,我能够获得预期的行为。

DispatchQueue.global().async {
let dispatchGroup = DispatchGroup()

dispatchGroup.enter()
DispatchQueue.global().asyncAfter(deadline: .now() + 10) {
print("Did one thing")
dispatchGroup.leave()
}

dispatchGroup.enter()
DispatchQueue.global().async {
print("Did the other thing")
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
print("Did all the things")
}
dispatchGroup.wait()
print("done waiting")
}

最新更新