2017-08-14 108 views
1

我製作了DispatchGroup並運行了2個異步任務。一個在main上,另一個在global()上。DispatchGroup無法按預期方式工作

只要我明白,DispatchGroup.notify的塊應該在所有任務完成後調用,但它不會像我想的那樣工作。

class Que { 
    let group = DispatchGroup() 

    init() { 
     group.notify(queue: .main) { 
     print("group done") 
     } 
    } 

    func run() { 
     doC() 
     doD() 
    } 

    fileprivate func doC() { 
     group.enter() 
     DispatchQueue.main.async(group: group) { 
      var rst = 0 
      for idx in 0 ..< 500 { 
       rst += idx 
      } 
      print("work item c is done") 
      self.group.leave() 
     } 
    } 

    fileprivate func doD() { 
     group.enter() 
     DispatchQueue.global().async(group: group) { 
      var rst = 0 
      for idx in 0 ..< 50 { 
       rst += idx 
      } 
      print("work item d is done") 
      self.group.leave() 
     } 
    } 
} 

結果是

work item d is done 
group done 
work item c is done 

我想知道爲什麼它不是

work item d is done 
work item c is done 
group done 

如果我做了global()隊列CD任務運行,它的工作。

回答

2

你把電話打到notify錯誤的地方,現在稱它太早了。

很可能你想在run方法的結尾呼叫notify

init() { 
} 

func run() { 
    doC() 
    doD() 

    group.notify(queue: .main) { 
     print("group done") 
    } 
} 

注意什麼說的notify方法的文檔中:

調度工作項時,一組以前提交塊的對象已經完成提交到隊列。

大膽的是我的。

+0

所以它不像平常的回調關閉。我想如果我設置了一次,每次在組中完成時都會調用它。謝謝! – Ryan

+1

當隊列中沒有當前任務時(在最後一次對任何當前輸入的任務進行「離開」調用之後)它會被調用。 – rmaddy

相關問題