2016-07-24 34 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)}