我可以不在循环中使用调度组吗?

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        
        }
   }

在这种情况下,您会将 leaveenter 语句放在哪里?

在这种情况下,您的 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
}