斯威夫特DispatchGroup任务完成前通知

Vic*_*tor 1 dispatch ios swift

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.")
}
Run Code Online (Sandbox Code Playgroud)

日志:

all finish.
image
video
Run Code Online (Sandbox Code Playgroud)

Sma*_*cat 6

更新: 上面的问题实际上按原样正确运行(如rmaddy所指出!)

万一其他人对DispatchQueue的async(group :)方法行为感到困惑,我将其保存在下面的错误答案中,因为苹果对此的快速文档目前很糟糕。


需要在每次调用async()之前调用组的enter(),然后需要在每个async()块的末尾(但该块)调用该组的Leave()。基本上就像refcount一样,当它达到零(没有剩余输入)时,将调用notify块。

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.")
}
Run Code Online (Sandbox Code Playgroud)

  • 那么调用 `async` 时的 `group` 参数有什么意义呢?这种用法应该可以排除调用“enter”和“leave”的需要。 (2认同)