Swift DispatchGroup 在任务完成前通知
Swift DispatchGroup notify before task finish
我正在使用 DispatchGroup
执行任务,但 group.notify
在任务完成之前被调用。
我的代码:
let group = DispatchGroup()
let queueImage = DispatchQueue(label: "com.image")
let queueVideo = DispatchQueue(label: "com.video")
queueImage.async(group: group) {
sleep(2)
print("image")
}
queueVideo.async(group: group) {
sleep(3)
print("video")
}
group.notify(queue: .main) {
print("all finished.")
}
日志:
all finish.
image
video
更新: 上面的问题实际上按原样正确运行(正如 rmaddy 指出的!)
我将这个错误的答案保存在下面,以防其他人对 DispatchQueue 的 async(group:) 方法行为感到困惑,因为 Apple's swift doc on it 目前很糟糕。
组的enter()需要在每次调用async()之前调用,然后组的leave()需要在每个async()块结束时调用,但是在块。它基本上就像一个引用计数,当它达到零时(没有输入剩余),然后调用通知块。
let group = DispatchGroup()
let queueImage = DispatchQueue(label: "com.image")
let queueVideo = DispatchQueue(label: "com.video")
group.enter()
queueImage.async(group: group) {
sleep(2)
print("image")
group.leave()
}
group.enter()
queueVideo.async(group: group) {
sleep(3)
print("video")
group.leave()
}
group.notify(queue: .main) {
print("all finished.")
}
一般答案:(Swift 5)
let yourDispatchGroup = DispatchGroup()
yourDispatchGroup.enter()
task1FunctionCall {
yourDispatchGroup.leave() //task 1 complete
}
yourDispatchGroup.enter()
task2FunctionCall {
yourDispatchGroup.leave() //task 2 complete
}
.. ..
yourDispatchGroup.enter()
tasknFunctionCall {
yourDispatchGroup.leave() //task n complete
}
dispatchGroup.notify(queue: .main) {
//This is invoked when all the tasks in the group is completed.
}
如果您的 DispatchGroup
是 lazy var
,请尽量不要在初始化代码块中调用 notify
方法。
lazy var dispatchGroup: DispatchGroup = {
let dispatchGroup = DispatchGroup()
// not call here dispatchGroup.notify(...
return dispatchGroup
}()
您需要在 notify
方法之前调用所有 enter
方法:
dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
// ...
self.dispatchGroup.leave()
}
dispatchGroup.notify(queue: .main) {
print("all finished.")
}
我正在使用 DispatchGroup
执行任务,但 group.notify
在任务完成之前被调用。
我的代码:
let group = DispatchGroup()
let queueImage = DispatchQueue(label: "com.image")
let queueVideo = DispatchQueue(label: "com.video")
queueImage.async(group: group) {
sleep(2)
print("image")
}
queueVideo.async(group: group) {
sleep(3)
print("video")
}
group.notify(queue: .main) {
print("all finished.")
}
日志:
all finish.
image
video
更新: 上面的问题实际上按原样正确运行(正如 rmaddy 指出的!)
我将这个错误的答案保存在下面,以防其他人对 DispatchQueue 的 async(group:) 方法行为感到困惑,因为 Apple's swift doc on it 目前很糟糕。
组的enter()需要在每次调用async()之前调用,然后组的leave()需要在每个async()块结束时调用,但是在块。它基本上就像一个引用计数,当它达到零时(没有输入剩余),然后调用通知块。
let group = DispatchGroup()
let queueImage = DispatchQueue(label: "com.image")
let queueVideo = DispatchQueue(label: "com.video")
group.enter()
queueImage.async(group: group) {
sleep(2)
print("image")
group.leave()
}
group.enter()
queueVideo.async(group: group) {
sleep(3)
print("video")
group.leave()
}
group.notify(queue: .main) {
print("all finished.")
}
一般答案:(Swift 5)
let yourDispatchGroup = DispatchGroup()
yourDispatchGroup.enter()
task1FunctionCall {
yourDispatchGroup.leave() //task 1 complete
}
yourDispatchGroup.enter()
task2FunctionCall {
yourDispatchGroup.leave() //task 2 complete
}
.. ..
yourDispatchGroup.enter()
tasknFunctionCall {
yourDispatchGroup.leave() //task n complete
}
dispatchGroup.notify(queue: .main) {
//This is invoked when all the tasks in the group is completed.
}
如果您的 DispatchGroup
是 lazy var
,请尽量不要在初始化代码块中调用 notify
方法。
lazy var dispatchGroup: DispatchGroup = {
let dispatchGroup = DispatchGroup()
// not call here dispatchGroup.notify(...
return dispatchGroup
}()
您需要在 notify
方法之前调用所有 enter
方法:
dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
// ...
self.dispatchGroup.leave()
}
dispatchGroup.notify(queue: .main) {
print("all finished.")
}