返回

用 Async/Await 重新构建 SwiftUI 中类 Redux 的状态容器

IOS

在 SwiftUI 中管理状态是一项至关重要的任务。从简单数据到复杂对象,我们的应用程序需要一种可靠且可维护的方法来跟踪和更新其状态。Redux 是一种流行的状态管理模式,提供了许多好处,例如可预测性、调试和测试的容易性。

本文探讨了如何使用 Swift 5.5 版本中引入的 Async/Await 特性,来重新构建类 Redux 的 SwiftUI 状态容器。我们将深入探讨 Async/Await 如何简化代码,提高可读性,并为我们的应用程序带来新的可能性。

Redux 的简单介绍

Redux 是一个开源 JavaScript 库,用于管理应用程序的状态。它遵循三个核心原则:

  • 单一的事实来源: 所有应用程序状态都存储在一个单一的中央存储库中。
  • 不可变状态: 状态只能通过纯函数更新。
  • 动作: 状态更新是通过称为动作的不可变对象触发的。

Async/Await 简介

Async/Await 是 Swift 5.5 引入的一组,用于简化异步编程。Async/Await 允许我们将异步代码写成同步代码,从而提高代码的可读性和可维护性。

使用 Async/Await 重新构建状态容器

使用 Async/Await 重新构建 SwiftUI 状态容器涉及以下步骤:

1. 定义一个 AsyncStore 类

AsyncStore 是一个泛型类,它包裹一个状态值,并提供更新状态的方法。

class AsyncStore<State> {
    @Published private(set) var state: State

    func updateState(_ action: (inout State) -> Void) {
        await withCheckedContinuation { continuation in
            action(&state)
            continuation.resume(returning: ())
        }
    }
}

2. 在 SwiftUI 视图中使用 AsyncStore

在 SwiftUI 视图中使用 AsyncStore 很简单:

struct MyView: View {
    @ObservedObject private var store = AsyncStore(state: 0)

    var body: some View {
        VStack {
            Text("State: \(store.state)")
            Button("Increment") {
                await store.updateState { $0 += 1 }
            }
        }
    }
}

好处

使用 Async/Await 重新构建状态容器具有以下好处:

  • 更简洁的代码: Async/Await 消除了处理异步操作的需要,从而简化了代码。
  • 更高的可读性: Async/Await 使异步代码看起来更像同步代码,从而提高了可读性。
  • 更好的可测试性: Async/Await 可以简化单元测试,因为测试可以同步执行。
  • 更广泛的可能性: Async/Await 可以解锁使用其他异步 API 的可能性,例如网络请求和数据库操作。

结论

使用 Async/Await 重新构建 SwiftUI 状态容器是一个令人兴奋的机会,可以提高代码的简洁性、可读性、可测试性和可能性。通过采用这种新特性,我们可以编写更强大、更易于维护的 SwiftUI 应用程序。