同步嵌套异步任务



我已经嵌套了异步任务。以下功能以下流程:loadePisodes(加载情节列表) ->使用从完成的数组进行循环到每个情节第一,并加载特定情节的加载注释(另一项异步任务)。

问题是:在完成注释加载任务之前,请在comletion(FullyEpisodes)中拒绝。我尝试使用调度组(第二个代码块),但行不通。

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

当我尝试通过"打印("某物")"(不是新的async任务)替换注释加载请求时,调度组正在工作。

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

最新更新