Verge是一个为Swift设计的高性能、可扩展的状态管理库,考虑到了真实世界的使用场景。它提供了一种轻量级且易于使用的方法来管理应用程序状态,无需复杂的操作和减速器。本指南将带您了解在Swift项目中使用Verge的基础知识。
Verge的设计考虑了以下概念:
commit
函数,该函数接受描述如何更改状态的闭包。要使用Verge,请按照以下步骤操作:
Equatable
协议的状态结构体。Store
。commit
方法更新状态。sinkState
方法订阅状态更新。创建一个代表应用程序状态的状态结构体。您的状态结构体应符合Equatable
协议。这允许Verge检测状态的变化并在必要时触发更新。
示例:
struct MyState: StateType { var count: Int = 0 }
使用应用程序的初始状态创建一个Store
实例。Store
类接受两个类型参数:
Never
。示例:
let store = Store<_, Never>(initialState: MyState())
要更新应用程序状态,请使用Store
实例上的commit
方法。commit
方法接受一个闭包,该闭包有一个参数,即对状态的可变引用。在闭包内部,根据需要修改状态。
示例:
store.commit { $0.count += 1 }
要在状态更改时接收更新,请使用Store
实例上的sinkState
方法。此方法接受一个闭包,该闭包接收更新后的状态作为其参数。每当状态发生变化时,都会调用该闭包。
示例:
store.sinkState { state in // 接收状态的更新 } .storeWhileSourceActive()
最后的storeWhileSourceActive()
调用是Verge提供的一种方法,用于自动管理订阅的生命周期。它会在源(在本例中为store
实例)处于活动状态时保留订阅。
就是这样!您现在了解了使用Verge在Swift应用程序中管理状态的基础知识。对于更高级的用例和其他功能,请参阅官方Verge文档和GitHub存储库。
在某些情况下,事件驱动编程对于创建响应迅速和高效的应用程序至关重要。Verge库的存储活动功能旨在满足这一需求,允许开发人员在其项目中无缝处理事件。
当您的应用程序需要事件驱动编程时,存储的活动就派上用场了。它使您能够独立于主存储管理来管理事件和相关逻辑,促进了清晰和有组织的代码结构。这种关注点分离简化了整体开发过程 ,并使维护和扩展应用程序变得更加容易。
通过利用存储的活动功能,您可以在保持存储管理完整的同时高效地处理应用程序中的事件。这确保了您的应用程序保持高性能和可扩展性,使您能够使用Verge库构建强大可靠的Swift应用程序。
以下是使用存储的活动的示例:
let store: Store<MyState, MyActivity> store.send(MyActivity.somethingHappened)
store.sinkActivity { (activity: MyActivity) in // 处理活动 } .storeWhileSourceActive()
要在SwiftUI中使用Verge,您可以利用StoreReader
在SwiftUI视图中订阅状态更新。以下是如何做到这一点的示例:
import SwiftUI import Verge struct ContentView: View { @StoreObject private var viewModel = CounterViewModel() var body: some View { VStack { StoreReader(viewModel.store) { state in Text("计数: \(state.count)") .font(.largeTitle) } Button(action: { viewModel.increment() }) { Text("增加") } } } } final class CounterViewModel: StoreComponentType { struct State: Equatable { var count: Int = 0 } let store: Store<State, Never> = .init(initialState: .init()) func increment() { commit { $0.count += 1 } } }
在这个例子中,StoreReader
用于读取MyViewModel
存储的状态。这允许您在SwiftUI视图中访问和显示状态。此外,您可以通过直接调用存储上的方法来执行操作,如示例中的按钮所示。
这个新部分将帮助用户理解如何在SwiftUI中使用Verge,使他们能够在SwiftUI视图中有效管理状态。如果您有任何进一步的建议或更改,请告诉我!
StoreObject属性包装器:
SwiftUI提供了@StateObject
属性包装器来创建和管理遵循ObservableObject协议的给定对象的持久实例。然而,每当ObservableObject更新时,StateObject都会导致视图刷新。
在Verge中,我们引入了StoreObject属性包装器,它在视图的生命周期内实例化一个Store对象,但当Store更新时不会导致视图刷新。
当您想以更细粒度的方式管理Store,而不希望Store更改时导致整个视图刷新时,这很有用。相反,Store的更新可以通过StoreReader来处理。
以下是Verge在UIViewController中的简单使用示例:
class MyViewController: UIViewController { private struct State: Equatable { var count: Int = 0 } private let store: Store<State, Never> = .init(initialState: .init()) private let label: UILabel = .init() override func viewDidLoad() { super.viewDidLoad() setupUI() // 订阅store的状态更新 store.sinkState { [weak self] state in guard let self = self else { return } // 使用ifChanged检查值是否已更新 state.ifChanged(\.count) { count in self.label.text = "Count: \(count)" } } .storeWhileSourceActive() } private func setupUI() { // 为简洁起见省略 } private func incrementCount() { store.commit { $0.count += 1 } } }
sinkState
、Changed<State>
和ifChanged
在UIKit中高效更新状态在事件驱动的UIKit中,高效更新组件至关重要,只在需要时更新它们。Verge库提供了一种使用sinkState
方法、Changed<State>
类型和ifChanged
方法来实现这一点的方法。
当使用sinkState