2017-01-01 45 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

沒關係問題。我通過創建第二組來完成工作。 –

相關問題