swift - 当调用了另外两个完成 block 时调用完成 block

标签 swift swift3 grand-central-dispatch

我有一个函数 doEverything 需要一个完成 block 。它调用另外两个函数,doAlphadoBeta,它们都有完成 block 。这两个函数应该异步运行。我想在其他两个函数都调用了它们的完成 block 之后调用 doEverything 的完成 block 。

目前,它看起来像这样:

func doEverything(completion: @escaping (success) -> ())) {
    var alphaSuccess = false
    var betaSuccess = false

    doAlpha { success in
        alphaSuccess = success
    }

    doBeta { success in
        betaSuccess = success
    }

    // We need to wait here
    completion(alphaSuccess && betaSuccess)
}

doAlphadoBeta 应该同时运行,一旦它们都完成,完成 block 应该用 alpha 和 beta 的结果调用。

我已经阅读了调度组和障碍,但我不确定哪个最合适,它们如何引入新范围(关于我正在使用的两个变量)以及我应该如何实现它。

非常感谢。

最佳答案

Grand Central Dispatch (GCD) 是您在这里尝试做的事情的一个很好的选择,您可以通过使用 DispatchQueue 来实现。和 DispatchGroup ,如下:

swift 3:

func doEverything(completion: @escaping () -> ()) {
    let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
    let group = DispatchGroup()

    group.enter()
    queue.async (group: group) {
        print("do alpha")

        group.leave()
    }

    group.enter()
    queue.async (group: group) {
            print("do beta")

        group.leave()
    }

    group.notify(queue: DispatchQueue.main) {
        completion()
    }
}

或者,您可以通过这种方式实现它(我发现这种方式更具可读性):

func doEverything(completion: @escaping () -> ()) {
    let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
    let group = DispatchGroup()

    queue.async (group: group) {
        print("do alpha")
    }

    queue.async (group: group) {
        print("do beta")
    }

    group.notify(queue: DispatchQueue.main) {
        completion()
    }
}

请注意,我从 completion 闭包中删除了 success 标志。

在这种情况下,“do beta”(第二个 queue.async 的执行)将不会执行,直到“do alpha”(第一个 queue.async 的执行) ) 完成,那是因为 queue 目标是 .main。如果你想让 queue.async 同时工作,不需要创建额外的队列,同一个队列应该可以完成工作,通过替换:

let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)

与:

let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent)

现在,系统将控制这两个 queue.async 任务应该如何同时工作(显然,group.notify 将在任务拖后执行完成)。

希望这对您有所帮助。

关于swift - 当调用了另外两个完成 block 时调用完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41809000/

相关文章:

swift - 截断文本的最大行高

swift - 你必须手动指定你的DispatchQueue是串行的吗?

ios - 如何在 Swift 3 中创建调度队列

macos - 什么被认为是主线程重载?

ios - DisposeBag 内存泄漏?

ios - Xcode:项目中framework和pod有区别吗?

swift - 打印语句未打印

iOS UIImageView 点击只在 View 的顶部注册

ios - Swift 删除文本文件 : Are these files actually deleted?

swift - Swift 3 的二元运算符