首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用DispatchGroup在for循环中进行异步调用

如何使用DispatchGroup在for循环中进行异步调用
EN

Stack Overflow用户
提问于 2016-11-17 10:48:50
回答 1查看 3.1K关注 0票数 3

在下面的示例代码中,我在失败时调用complete(false)。但是,由于我使用DispatchGroup对象来确保所有异步请求都完成,所以不能只在失败时调用syncGroup.leave(),因为notify将被调用,其中包含complete(true),使该函数返回true,而它应该返回失败的false

在未能正确完成我的功能时,我没有调用syncGroup.leave(),对吗?或者我应该打电话给syncGroup.leave(),并以某种方式确定结果是什么,这样我就可以在失败时返回false

代码语言:javascript
运行
复制
let syncGroup = DispatchGroup()
syncGroup.enter()
for track in unsynced {
    register(time: time, withCompletion: { (success: Bool) -> () in

        if success {
            self.debug.log(tag: "SyncController", content: "Registered")
            syncGroup.leave()
        }
        else {
            complete(false)
        }
    })
}

//all requests complete
syncGroup.notify(queue: .main) {
    self.debug.log(tag: "SyncController", content: "Finished registering")
    complete(true)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-17 11:21:55

您必须在for循环中输入组。您可能需要引入一个额外的错误标志。

实例实现:

代码语言:javascript
运行
复制
    var fail = false
    let syncGroup = DispatchGroup()

    for track in unsynced {
        syncGroup.enter()
        register(time: time, withCompletion: { (success: Bool) -> () in

            if success {
                self.debug.log(tag: "SyncController", content: "Registered")
                syncGroup.leave()
            }
            else {
                fail = true
                syncGroup.leave()
            }
        })
    }

    //all requests complete
    syncGroup.notify(queue: .main) {
        if fail {
            complete(false)

        } else {
            self.debug.log(tag: "SyncController", content: "Finished registering")
            complete(true)
        }
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40652869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档