Swift 的并发特性使得通过 async/await 处理异步任务变得轻而易举。为一个任务连接加载状态也很容易。但是,如果您有多个任务正在运行呢?在这些情况下,跟踪一个单独的加载状态会有点困难。
TaskLoadingAggregate 通过为您的任务创建一个加载状态聚合,使这一切变得轻松。每个跟踪的任务都会将其状态报告给聚合,只要有一个任务正在加载,聚合就会将 isLoading
报告为 true
。
将任务连接到 TaskLoadingAggregate 非常简单,只需…
let loadingAggregate = TaskLoadingAggregate()
// First task
Task {
try await doSomething()
}.track(loadingAggregate)
// Second task
Task {
try await doSomethingElse()
}.track(loadingAggregate)
// You can now bind your UI or whatever to loadingAggregate's @Published isLoading property 🚀
ActivityIndicator(isAnimating: loadingAggregate.isLoading, style: .large)
// And as @Published is a `Published<Bool>` you can use Combine to do whatever:
loadingAggregate.$isLoading
.sink { isLoading in
if isLoading {
doSomething()
} else {
doSomethingElse()
}
}
.store(in: &cancellables)
不,您可以根据自己的喜好使用 TaskLoadingAggregate,但那样就需要您自己来增加和减少聚合的加载计数器
let loadingAggregate = TaskLoadingAggregate()
// In async function
func doSomething() async {
loadingAggregate.increment()
await doSomethingElse()
loadingAggregate.decrement()
}
// In classic closure
loadingAggregate.increment()
self.doSomething(completion: {
loadingAggregate.decrement()
})
TaskLoadingAggregate 在 MIT 许可下慷慨发布。