2016-12-02 21 views
5

ネストされた非同期タスクがあります。 loadEpisodes(エピソードのリストをロードする) - >各エピソード1を介して完了からループまでの配列を使用して、特定のエピソードのコメント(さらに1つの非同期タスク)をロードします。ネストされた非同期タスクを同期する

問題は次のとおりです。comletion(fullyEpisodes)がコメントの読み込みタスクを完了する前に実行されました。 Dispatch Group(2番目のコードブロック)を使用しようとしましたが、機能しません。

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) 

}) 
} 

実装発送グループ:私は「印刷(」何か「)」(ない新しい非同期タスク)によって、コメントのロード要求を交換しようとすると

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

    }) 
} 

、ディスパッチグループが取り組んでいます。

+0

あなたは '壮大-中央dispatch'ない'最大公約-divisor'を意味考える;) –

+0

@ JacobKing:おっと!私は間違ったタグを設定した。ありがとうございます:D –

+2

gcdのタグを指定すると、大した共通の除数よりも大規模な中央ディスパッチに関するスタックオーバーフローに関する質問がはるかに多いにもかかわらず、gcdのタグを "最大公約数"に置き換えてください。 http://meta.stackoverflow.com/q/251143/1271826またはhttp://meta.stackexchange.com/questions/165133/propose-significant-change-in-the-definition-of-gcd-tag – Rob

答えて

4

2番目の例では、(a)group.leave()load()完了ハンドラのクロージャに移動します。 (b)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) 
     }) 

    }) 
} 

や、クロージャ構文を末尾とcompletionスペルを固定して少しのことをクリーンアップ:

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を参照してください。あなたの指示に従って編集する。しかし、Webサービス()ロードを実行する前に、group.notify ..(comletion(fullyEpisodes))を実行しました。 @Rob –

+0

よろしいですか?それは働いている。どうもありがとうございます :) –