2016-07-24 12 views
11

Po przeczytaniu ewolucji Swift 3 na GCD, próbuję utworzyć grupę wysyłkową. Problem polega na tym, że group.notify(queue: nie powiadamia, gdy przekazuję DispatchQueue.main jako kolejkę, chociaż działa ona w tle kolejki.Grupa wysyłkowa - nie można powiadomić głównego wątku

Również nie jestem pewien, że moje składnia jest poprawne, ponieważ staram się przekształcić kod Swift Swift 2 do 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. 

Ten kod nie działa

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

To działa poprawnie

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

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

Co znajduje się kod, który _doesn't_ „działa poprawnie”? – matt

+0

@matt, Edytowałem pytanie dla jasności, kiedy próbuję powiadomić przez 'group.notify (kolejka: DispatchQueue.main, wykonaj: {' blok zakończenia zwraca nic (nie można wydrukować 'wartości Bool'), gdzie jak kiedy Mijam współbieżną kolejkę 'backgroundQ',' 'Bool' value' true' jest zwracana i drukowana poprawnie' longCalculations() {print ($ 0)} '. – jyet

+2

Używasz' enter' i 'leave' niepoprawnie. aby przeczytać ten artykuł: http://amro.co/gcd-using-dispatch-groups-for-fun-and-profit – matt

Odpowiedz

24

Po przeczytaniu postu sugerowanego przez Matta, stwierdziłem, że przesyłam zadanie do głównej kolejki i kiedy poprosiłem o powiadomienie o głównym wątku, dostałem się w impas.

mam zmieniony kod, a teraz działa zgodnie z przeznaczeniem,

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)} 
Powiązane problemy