簡體   English   中英

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 的 swift 文檔目前很糟糕。


組的 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.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM