Dispatch group - 无法通知主线程

时间:2016-07-24 12:46:43

标签: swift grand-central-dispatch swift3

在GCD上阅读Swift 3 evolution之后,我正在尝试创建调度组。问题是group.notify(queue:在我将DispatchQueue.main作为队列传递时不通知,尽管它适用于后台队列。

此外,我不确定我的语法是否正确,因为我正在尝试将代码从Swift 2转换为Swift 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)
    })
 }

这可以正常使用

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

longCalculations() { print($0) }

1 个答案:

答案 0 :(得分:29)

在阅读了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)}