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

时间:2016-11-17 10:48:50

标签: ios swift swift3 grand-central-dispatch

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

我是否因未能正确完成我的功能而未致电false?或者我应该调用syncGroup.leave()并以某种方式尝试确定结果是什么,所以我可以在失败时返回syncGroup.leave()

false

1 个答案:

答案 0 :(得分:3)

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

示例实施:

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