Apex
Apex 设计用于帮助您以声明方式构建您的应用程序,并在应用程序的逻辑与它不可避免产生的副作用之间进行明确的分离。
这通过将您的应用程序想象成一个 摩尔类型的状态机 来实现。如维基百科文章所述,摩尔机可以通过其组成部分来定义。
- 状态集:这是由您提供的 State struct 在 Apex 中进行建模。它必须是一个 struct,以便 Store 外部的代码不能通过指定的接口修改它,除非通过该接口。这个 struct 代表应用程序可能处于的所有可能状态。该 struct 可以是可变的,因为它是一个值类型。事实真相位于 Apex Store 中。
- 起始状态:这是由传入 Apex Store 的状态 struct 的值在 Apex 中进行建模。您的应用程序的初始状态可以由 State struct 的默认
init
方法来建模,但您也可以从持久存储中加载状态值并输入。 - 输入字母表:这是由 Apex 中的 Action 值进行建模。动作可以是任何类型,但所有动作都是不可变的。因此,它们最好是用枚举构建,但它们也可以是 struct 或类,只要所有属性都是不可变的。
- 转换函数:这是通过在构建 Store 时传入的更新函数进行建模。这个函数表示应用程序的逻辑,并且是唯一发生状态转换的地方。您的更新函数需要是 引用透明的。当然,这个函数可以通过功能分解调用其他函数。
- 输出函数:在 Apex 中,输出函数由订阅 Store 的各种函数进行建模。输出函数是在状态更改时执行所有副作用的地方。
使用 Apex
要使用 Apex,您创建一个单独的 Store
对象来管理您应用程序的状态。此存储对象可以是全局的或传递给需要访问或修改状态的对象。
处理异步性和副作用。
Apex 通过两种方式处理异步性和副作用:命令(Command
)和订阅(Subscription
)。
当您需要执行某种一次性任务时使用命令。这些都包括许多网络请求,以及获取随机数或您基本上可以发出并忘记直到收到响应的任何事。命令 可以 用作对某些内容的持续监控,但请注意,一旦启动,命令就不能取消。
对于要取消的持续任务或副作用,如视图控制器,请使用订阅。
网络命令
由于系统最常用的用途是进行网络请求,库中已添加了一个特殊的 URLCommand
。当您需要发起网络请求时,在您的 reducer 中创建一个 URLCommand 并返回它。您可以通过测试返回的正确命令来验证,因为所有命令都是相等的。商店将执行您从 reducer 返回的任何命令。
视图控制器管理
随系统提供的另一个有用组件是《ViewControllerPresentationComponent》。要使用此组件,创建一个实例,传递窗口的根视图控制器、存储(store)和一个透镜/选择器(一个提取该组件相应状态部分的函数)。您的状态对象需要一个表示数组 property,它包含可哈希类型的`ViewController`,这些类型充当`UIViewController`的工厂。这个组件会根据状态中的数组显示和关闭`UIViewController`以维护一致性。要显示视图控制器,将其工厂添加到状态对象的`ViewController`数组中,要关闭它,则从数组中移除。与操作类似,符合`ViewController`协议的类型可以是任何类型,只要它是不可变的,最好将其设计为枚举。