2016-12-02 42 views
5

Mam zagnieżdżone zadania asynchroniczne. Funkcja poniżej następującego po niej przepływu: loadEpisodes (załaduj listę odcinków) -> użyj tablicy od zakończenia, aby przejrzeć każdy odcinek pierwszy i załaduj komentarze (jeszcze jedno zadanie asynchroniczne) dla określonego odcinka.Synchronizuj zagnieżdżone zadanie asynchroniczne

Problem polega na: comletion (fullEpisodes) sprawdzony przed zakończeniem zadania ładowania komentarzy. Próbowałem użyć Dispatch Group (drugi blok kodu), ale to nie działa.

func loadComments(comletion: @escaping ([Episode]) -> Void){ 
loadEpisodes(completion: { 
    episodes in 
    var fullyEpisodes = [Episode]() 
    for episode in episodes { 
     WebService().load(resource: episode.comment, comletion: { 
      comments in 
      if let comments = comments { 
       let _episode = Episode(id: episode.id, title: episode.title, comments: comments) 
       fullyEpisodes.append(_episode) 
       print("done") 
      } 
     }) 
    } 
    comletion(fullyEpisodes) 

}) 
} 

Zaimplementowane Wysłanie Grupa:

func loadComments(comletion: @escaping ([Episode]) -> Void){ 
    loadEpisodes(completion: { 
     episodes in 
     var fullyEpisodes = [Episode]() 
     let group = DispatchGroup() 
     for episode in episodes { 
      group.enter() 
      WebService().load(resource: episode.comment, comletion: { 
       comments in 
       if let comments = comments { 
        let _episode = Episode(id: episode.id, title: episode.title, comments: comments) 
        fullyEpisodes.append(_episode) 
        print("done") 
       } 
      }) 
      group.leave() 
     } 
     group.wait() 
     group.notify(queue: .main, execute: { 
      comletion(fullyEpisodes) 
     }) 

    }) 
} 

Kiedy próbuję zastąpić żądania obciążenia komentarz przez „print (” coś „)” (nie nowe zadanie asynchroniczne), grupa Wysłanie działa.

+0

Pomyśl oznaczało 'grand-środkowo-dispatch' nie' Największą-common-divisor';) –

+0

@JacobKing: Ups! Ustawiłem niewłaściwy tag. Dzięki: D –

+2

Tak, denerwująco, określenie tagu gcd zastępuje go "największy-wspólny-dzielnik" (mimo, że istnieje dużo więcej pytań na temat Stack Overflow dotyczących głównej centralnej wysyłki niż największy wspólny dzielnik). Zobacz http://meta.stackoverflow.com/q/251143/1271826 lub http://meta.stackexchange.com/questions/165133/propose-significant-change-in-definition-of-gcd-tag – Rob

Odpowiedz

4

W swoim drugim przykładzie (a) przenieś group.leave() do zamknięcia obsługi zakończenia realizacji ; i (b) całkowicie usunąć group.wait().

func loadComments(comletion: @escaping ([Episode]) -> Void){ 
    loadEpisodes(completion: { 
     episodes in 
     var fullyEpisodes = [Episode]() 
     let group = DispatchGroup() 
     for episode in episodes { 
      group.enter() 
      WebService().load(resource: episode.comment, comletion: { 
       comments in 
       if let comments = comments { 
        let _episode = Episode(id: episode.id, title: episode.title, comments: comments) 
        fullyEpisodes.append(_episode) 
        print("done") 
       } 
       group.leave() 
      }) 
      // group.leave() 
     } 
     //group.wait() 
     group.notify(queue: .main, execute: { 
      comletion(fullyEpisodes) 
     }) 

    }) 
} 

lub czyszczenia, że ​​się trochę ze spływu składni zamykania i mocowania completion pisowni:

func loadComments(completion: @escaping ([Episode]) -> Void) { 
    loadEpisodes { episodes in 
     var fullyEpisodes = [Episode]() 
     let group = DispatchGroup() 
     for episode in episodes { 
      group.enter() 
      WebService().load(resource: episode.comment) { comments in 
       if let comments = comments { 
        let _episode = Episode(id: episode.id, title: episode.title, comments: comments) 
        fullyEpisodes.append(_episode) 
       } 
       group.leave() 
      } 
     } 
     group.notify(queue: .main) { 
      completion(fullyEpisodes) 
     } 
    } 
} 
+0

I edytowane za pomocą instrukcji. Ale wykonałem group.notify .. (comletion (fullEpisodes)), zanim zadzwonię do usługi Webservice(). @Rob –

+0

OK. To zadziałało. Bardzo dziękuję :) –