gpt4 book ai didi

arrays - 运行多个异步任务并在所有任务完成后收到通知

转载 作者:行者123 更新时间:2023-12-05 02:48:50 26 4
gpt4 key购买 nike

我想运行几个异步任务并在所有任务完成后收到通知。这些任务应该同时运行。我做的对吗?因为它立即调用通知并且不等待任务完成:

let dispatchGroup = DispatchGroup()
let queue = DispatchQueue(label: "com.name.group", attributes: .concurrent)

queue.async(group: dispatchGroup) {
self.asyncFunc1() { (data) in
// returns something
}
}

queue.async(group: dispatchGroup) {
self.asyncFunc2() { (data) in
// returns something
}
}

queue.async(group: dispatchGroup) {
self.asyncFunc3() { (data) in
// returns something
}
}

dispatchGroup.notify(queue: queue) {
DispatchQueue.main.async {
// Update the UI
}
}

dispatchGroup.notify() 是否应该在所有三个调用都完成后被触发?

最佳答案

调度组是正确的工具,但你用错了。一旦传递给 queue.async 的 block 完成,该组就会离开。相反,你也可以这样写:

group.enter()
queue.async {
// Stuff
group.leave()
}

一旦每次进入调用都发生了离开调用,通知函数就会调用它的 block 。

还有你的问题 - 离开调用发生在你的异步操作已经开始之后,而不是完成。对于您的用例,async(group:) 方法不起作用,您需要在调用异步函数之前手动调用 enter,并在完成处理程序中调用 leave:

group.enter()
asyncFunc1() { data in
// ...
group.leave()
}

根据您在回调 block 中执行的操作,您可能希望使用 defer 来调用 leave,以便它在任何情况下都会发生。

顺便说一句,如果您需要在通知处理程序中执行的所有操作都需要在主队列上运行,您也可以直接将其传递给通知。分派(dispatch)到另一个队列只是为了返回主队列是不必要且低效的。您可以使用任何队列 - 它不必是您安排工作的队列。调度组的全部意义在于同步多个队列。

dispatchGroup.notify(queue: .main) {
// Update UI
}

关于arrays - 运行多个异步任务并在所有任务完成后收到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64285755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com