2016-12-02 160 views
5

我有嵌套的异步任务。下面这个流程的函数:loadEpisodes(加载剧集列表) - >使用完成的数组遍历每集第一集,并为特定情节加载注释(多一个异步任务)。同步嵌套的异步任务

问题是:comletion(fullyEpisodes)在完成注释加载任务之前执行。我试图使用Dispatch Group(第二代码块),但它不工作。

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标签将其替换为“最大公约数”(尽管关于大中央调度的堆栈溢出问题比最大公约数要多得多)。见http://meta.stackoverflow.com/q/251143/1271826或http://meta.stackexchange.com/questions/165133/propose-significant-change-in-the-definition-of-gcd-tag – Rob

回答

4

在第二个示例中,(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

我用你的指令编辑。但是我执行了group.notify ..(comletion(fullyEpisodes))之前执行Webservice()。load。 @罗布 –

+0

好的。它的工作。非常感谢 :) –