将完成处理程序汇集在一起,以便在多次执行关闭时完成方法
问题描述:
我有一个场景,我想要并行执行三个不同的异步任务。一旦完成了所有三项任务,我就希望调用方法知道这一点并调用它自己的完成处理程序。将完成处理程序汇集在一起,以便在多次执行关闭时完成方法
下面是逻辑的这是一个非常简化的版本:
class ViewController: UIViewController {
func doTasks(with object: Object, completionHandler:() -> Void) {
// Once A, B & C are done, then perform a task
wrapupTask()
// When task is complete, call completionHandler
completionHandler()
}
}
fileprivate extension ViewController {
func taskA(with object: Object, completionHandler:() -> Void) {
// Do something
completionHandler()
}
func taskB(with object: Object, completionHandler:() -> Void) {
// Do something
completionHandler()
}
func taskC(with object: Object, completionHandler:() -> Void) {
// Do something
completionHandler()
}
}
我可以很容易链中的处理程序一起,但随后的任务可能会需要更长的时间和代码会吸。
我考虑的另一个项目是,每次增加一个简单的计数器任务完成了,那么,一旦命中3分,然后将通过这样的调用wrapupTask():
var count: Int {
didSet {
if count == 3 {
wrapupTask()
}
}
}
另一种选择我有考虑的是创建一个操作队列,然后将任务加载到其中,然后依赖于何时运行我的总结任务。一旦队列为空,它将调用完成处理程序。但是,这看起来比我想要完成的更多工作。
我的希望是有更好的东西,我只是想念。
答
只是想了解OOPer说什么,您正在寻找DispatchGroup。在下文中,调用taskA
,taskB
和taskC
是伪代码,但一切是真实的:
func doTasks(with object: Object, completionHandler:() -> Void) {
let group = DispatchGroup()
group.enter()
taskA() {
// completion handler
group.leave()
}
group.enter()
taskB() {
// completion handler
group.leave()
}
group.enter()
taskC() {
// completion handler
group.leave()
}
group.notify(queue: DispatchQueue.main) {
// this won't happen until all three tasks have finished their completion handlers
completionHandler()
}
}
每enter
由leave
在异步完成处理程序结束匹配,只有当所有的比赛实际上已经执行了,我们继续执行完成处理程序notify
。
您是否检查过['DispatchGroup'](https://developer.apple.com/reference/dispatch/dispatchgroup)? – OOPer
@OOPer打我吧。 :)另外,CodeBender,请注意操作队列也不是一个不好的解决方案。 – matt