gpt4 book ai didi

ios - Swift按顺序执行异步任务

转载 作者:搜寻专家 更新时间:2023-10-30 22:13:38 25 4
gpt4 key购买 nike

我有一些异步的网络任务需要在我的应用程序上执行。假设我有 3 个资源需要从服务器获取,将它们称为 ABC。假设我必须先完成获取资源 A,然后再获取 BC。有时,我想先获取 B,其他时候先获取 C

现在,我只有一个像这样的长链闭包:

func fetchA() {
AFNetworking.get(completionHandler: {
self.fetchB()
self.fetchC()
})
}

这目前有效,但明显的限制是我已将执行顺序硬编码到 fetchA 的完成处理程序中。现在,假设我只想在 fetchB 完成该完成处理程序后执行 fetchC,我将不得不更改 fetchB 的实现。 ..

本质上,我想知道是否有一些神奇的方法可以做类似的事情:

let orderedAsync = [fetchA, fetchB, fetchC]
orderedAsync.executeInOrder()

其中fetchAfetchBfetchC都是异步函数,但是fetchB直到fetchA 已完成,依此类推。谢谢!

最佳答案

您可以将串行 DispatchQueueDispatchGroup 混合使用,这将确保一次只会运行一个执行 block 。

let serialQueue = DispatchQueue(label: "serialQueue")
let group = DispatchGroup()
group.enter()
serialQueue.async{ //call this whenever you need to add a new work item to your queue
fetchA{
//in the completion handler call
group.leave()
}
}
serialQueue.async{
group.wait()
group.enter()
fetchB{
//in the completion handler call
group.leave()
}
}
serialQueue.async{
group.wait()
group.enter()
fetchC{
group.leave()
}
}

或者,如果您被允许使用第 3 方库,请使用 PromiseKit,它比 GCD 提供的任何方法都更容易处理,尤其是链接异步方法。查看official GitHub页面了解更多信息。您可以在 Promise 中包装一个带有完成处理程序的异步方法,并将它们链接在一起,如下所示:

Promise.wrap(fetchA(completion:$0)).then{ valueA->Promise<typeOfValueB> in
return Promise.wrap(fetchB(completion:$0)
}.then{ valueB in

}.catch{ error in
//handle error
}

此外,所有错误都通过您的 promise 传播。

关于ios - Swift按顺序执行异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45682622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com