2016-07-24 10 views
11
melden

Nachdem ich Swift 3 Evolution auf GCD gelesen habe, versuche ich Versandgruppe zu erstellen. Das Problem ist die group.notify(queue: Benachrichtigen Sie nicht, wenn ich DispatchQueue.main als eine Warteschlange übergeben, obwohl es für die Hintergrundwarteschlange funktioniert.Versandgruppe - kann nicht zum Hauptthread

Auch ich bin nicht sicher, ob meine Syntax alle richtig ist, wie ich Code von Swift 2 bis 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. 

Dieser Code zu konvertieren Ich versuche nicht funktionieren

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

Dies funktioniert einwandfrei

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

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

Was der Code ist, der „richtig funktionieren“ _doesn't_? – matt

+0

@matt, Ich habe Frage für Klarheit geklärt, wenn ich versuche, über 'group.notify zu benachrichtigen (Warteschlange: DispatchQueue.main, ausführen: {' der Completion-Block gibt nichts zurück (unfähig, 'Bool'-Wert zu drucken), wo als Ich übergebe eine gleichzeitige Warteschlange 'backgroundQ', der' Bool' Wert 'true' wird zurückgegeben und korrekt ausgedruckt' longCalculations() {print ($ 0)} '. – jyet

+2

Du verwendest' enter' und 'leave' falsch Sie sollten diesen Artikel lesen: http://amro.co/gcd-using-dispatch-groups-for-fun-and-profit – matt

Antwort

24

Nachdem ich Matt gelesen hatte, stellte ich fest, dass ich eine Aufgabe an die Hauptwarteschlange übergab und als ich darum bat, mich über den Hauptthread zu informieren, kam es in den Deadlock.

Ich habe den Code geändert und jetzt ist es wie beabsichtigt,

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)} 
Verwandte Themen