2017-01-01 58 views
0

我有一个场景,我想要并行执行三个不同的异步任务。一旦完成了所有三项任务,我就希望调用方法知道这一点并调用它自己的完成处理程序。将完成处理程序汇集在一起​​,以便在多次执行关闭时完成方法

下面是逻辑的这是一个非常简化的版本:

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

另一种选择我有考虑的是创建一个操作队列,然后将任务加载到其中,然后依赖于何时运行我的总结任务。一旦队列为空,它将调用完成处理程序。但是,这看起来比我想要完成的更多工作。

我的希望是有更好的东西,我只是想念。

+3

您是否检查过['DispatchGroup'](https://developer.apple.com/reference/dispatch/dispatchgroup)? – OOPer

+0

@OOPer打我吧。 :)另外,CodeBender,请注意操作队列也不是一个不好的解决方案。 – matt

回答

5

只是想了解OOPer说什么,您正在寻找DispatchGroup。在下文中,调用taskAtaskBtaskC是伪代码,但一切是真实的:

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

enterleave在异步完成处理程序结束匹配,只有当所有的比赛实际上已经执行了,我们继续执行完成处理程序notify

+0

这就是我正在寻找的 - 谢谢你们! – CodeBender

+0

如果我在任务中的完成处理程序中有完成处理程序,这是否工作? –

+0

没关系问题。我通过创建第二组来完成工作。 –

相关问题