TaskLoadingAggregate

轻松地跟踪 Swift 并发任务的聚合活动。

📄 描述

Swift 的并发特性使得通过 async/await 处理异步任务变得轻而易举。为一个任务连接加载状态也很容易。但是,如果您有多个任务正在运行呢?在这些情况下,跟踪一个单独的加载状态会有点困难。

隆重推出 TaskLoadingAggregate 🎉

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)

问:这仅适用于 Task 吗?

不,您可以根据自己的喜好使用 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()
})

😋 谁做的?

@amnell amnell

⚖️ 许可证

TaskLoadingAggregateMIT 许可下慷慨发布。