2017-08-14 109 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

相关问题