2016-07-24 33 views
11

在阅读Swift 3对GCD的进化之后,我试图创建调度组。问题是group.notify(queue:不通知当我通过DispatchQueue.main作为一个队列,虽然它的确适用于后台队列。调度组 - 无法通知主线程

而且我不知道我的语法是正确的,因为我想代码斯威夫特2转换为雨燕3.

typealias CallBack = (result: Bool) -> Void 
func longCalculations (completion: CallBack) { 

let backgroundQ = DispatchQueue.global(attributes: .qosBackground) 

    let group = DispatchGroup() 
    var fill:[Int] = [] 
    for item in 0...200 { 
     group.enter() 
     if item > 50 { 
      fill.append(item) 
     } 
     group.leave() 
    } 

//Below in the notify argument If I pass `backgroundQ`, it seems to work correctly but not when DispatchQueue.main is passed. 

这个代码不工作

group.notify(queue: DispatchQueue.main, execute: { 
    completion(result: true) 
    }) 
} 

This works correctly

group.notify(queue: backgroundQ, execute: { 
    completion(result: true) 
    }) 
} 
_______________________________________________________ 

longCalculations() { print($0) } 
+0

那是什么_doesn't_“正常工作”的代码? – matt

+0

@matt,当我尝试通过'group.notify(队列:DispatchQueue.main,执行:{'完成块返回任何内容(无法打印'Bool'值)“时,我已经编辑了清晰的问题,我传入一个并发队列'backgroundQ','Bool'值'true'返回并正确打印'longCalculations(){print($ 0)}'。 – jyet

+2

您正在使用'enter'和'leave'错误。你可以阅读这篇文章:http://amro.co/gcd-using-dispatch-groups-for-fun-and-profit – matt

回答

24

在阅读了Matt提出的帖子之后,我发现我正在向主队列提交任务,并且当我要求在主线程本身收到通知时,它陷入了僵局。

我修改代码,现在,它正在按照预期,

typealias CallBack = (result: [Int]) -> Void 
func longCalculations (completion: CallBack) { 
    let backgroundQ = DispatchQueue.global(attributes: .qosDefault) 
    let group = DispatchGroup() 

    var fill:[Int] = [] 
    for number in 0..<100 { 
     group.enter() 
     backgroundQ.async(group: group, execute: { 
      if number > 50 { 
      fill.append(number) 
      } 
      group.leave() 

      }) 
     } 

    group.notify(queue: DispatchQueue.main, execute: { 
     print("All Done"); completion(result: fill) 
    }) 
} 

longCalculations(){print($0)}