如何知道所有异步功能何时完成?

时间:2019-02-21 17:26:19

标签: ios swift

所有异步功能都完成后,我需要能够调用完成块。但是,它们并不都具有完成块。这是我的代码:

func pauseStream(completion: @escaping () -> ()) {
    disconnectFromSession()
    model.publishers = []

    model.pauseStream() { result in

    }
}

disconnectFromSession是一个异步函数,完成后会在委托类中触发一个回调函数didDisconnectFromSession

设置model.publishers = []Notification发布到NotificationCenter上,该类由类接收,然后更新UI。

最后model.pauseStream()有一个完成块,让我知道它何时完成。

我需要做的是一旦代码的所有异步部分都完成了,我想调用我的completion()函数的pauseStream块。最好的方法是什么?不幸的是,我无法将它们全部更改为具有完成块。

1 个答案:

答案 0 :(得分:4)

通常将调度组用于此类事情。这里的技巧是,如果您需要等待disconnectFromSession调用其完成处理程序,则需要让didDisconnectFromSession调用调度组的leave

因此为调度组创建ivar:

let group = DispatchGroup()

pauseStream调用因其相应的DispatchGroup调用而偏移时,让您的enter使用此leave来调用其完成处理程序:

func pauseStream(completion: @escaping () -> ()) {
    group.enter()
    disconnectFromSession()  // this will call `leave` in its delegate method

    model.publishers = []

    group.enter()
    model.someAsynchronousMethod() { result in
        defer { group.leave() }

        ...
    }

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

然后,您的didDisconnectFromSession将调用相应的leave

func didDisconnectFromSession(...) {
    group.leave()

    ...
}