我可以不在循环中使用调度组吗?
Can I use dispatch group not in a loop?
假设我有 3 个不同的异步任务要在调用某个函数之前完成。如果这些任务处于循环中,我知道使用调度组来做这样的事情,
var dispatchGroup = DispatchGroup()
for task in tasks {
dispatchGroup.enter()
DoSomeTask { (error, ref) -> Void in
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: DispatchQueue.main, execute: {
DoSomeFunction()
})
但是,如果这些任务都在同一个函数中但彼此之间没有关系,比如将 3 个不同的值推送到数据库,我很困惑您将如何执行此操作。像这样:
updateDatabase() {
var dispatchGroup = DispatchGroup()
DoTask1 { (error, ref) -> Void in
}
DoTask2 { (error, ref) -> Void in
}
DoTask3 { (error, ref) -> Void in
}
}
在这种情况下,您会将 leave
和 enter
语句放在哪里?
在这种情况下,您的 updateDatabase()
函数需要一个在所有更新完成后调用的完成块:
updateDatabase(onSccess completion:() -> Void) {
var dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DoTask1 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask2 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask3 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
completion()
}
}
你可以这样称呼它:
updateDatabase() {
//do somthing after updating
}
假设我有 3 个不同的异步任务要在调用某个函数之前完成。如果这些任务处于循环中,我知道使用调度组来做这样的事情,
var dispatchGroup = DispatchGroup()
for task in tasks {
dispatchGroup.enter()
DoSomeTask { (error, ref) -> Void in
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: DispatchQueue.main, execute: {
DoSomeFunction()
})
但是,如果这些任务都在同一个函数中但彼此之间没有关系,比如将 3 个不同的值推送到数据库,我很困惑您将如何执行此操作。像这样:
updateDatabase() {
var dispatchGroup = DispatchGroup()
DoTask1 { (error, ref) -> Void in
}
DoTask2 { (error, ref) -> Void in
}
DoTask3 { (error, ref) -> Void in
}
}
在这种情况下,您会将 leave
和 enter
语句放在哪里?
在这种情况下,您的 updateDatabase()
函数需要一个在所有更新完成后调用的完成块:
updateDatabase(onSccess completion:() -> Void) {
var dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DoTask1 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask2 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask3 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
completion()
}
}
你可以这样称呼它:
updateDatabase() {
//do somthing after updating
}