Redux.js 和 ReSwift 的行为完全不同。
在回答你的问题之前,让我先澄清一下。
清理 Redux.js/ReSwift 的困惑
ReSwift 中的动作创建者
“Action creators”在 Redux.js 中是一个相当专业的术语,但从 v4 开始,ReSwift 中的类型是这样定义的:
public typealias ActionCreator = (_ state: State, _ store: Store) -> Action?
因此与一般建议相反,您确实可以在调度操作时访问状态。您不需要 Thunk 实现,尽管 Thunks 或 Epics 可以在更复杂的情况下提供帮助。
“动作创建者帮助封装动作创建细节”
那是相当拗口:)
Redux.js 动作是对象字面量。如果你用 Swift 编写 Redux 操作,它们会更像 Dictionarys。这就是 Redux.js 中的 Action Creator 为工厂提供便利的方式(如“Factory”,Gang of Four 设计模式)。
不过,ReSwift.Action 类型通常以自定义值类型 (structs) 实现。 ReSwift 不会遇到 Redux.js 操作的问题。这意味着通过在 ReSwift 中创建自定义动作 type,将动作创建集中在一个函数中的好处就消失了。你的类型的初始化器已经提供了这个。
这描绘了一幅完全不同的画面。
这可能就是ReSwift.Store.ActionCreator 进入该州的原因:提供任何好处。以与 Redux 不同的 API 为代价。
适用于您的问题
例如,我有一个按钮,当用户按下它后,如果我处于状态 A,我想启动一些进程。所以,我必须编写一个动作创建器,它将检查当前状态,然后返回正确的动作,或根本不采取行动。然后从同一个地方分派这个动作。
有几种方法可以实现。
如果您有权访问 store 变量以调用 dispatch,您也可以访问其当前的 state 属性。您可以向商店询问应用程序所处的状态并采取相应措施。通常,您会编写商店订阅者以获取有关商店更改的“推送通知”,但在这种情况下,您也可以询问商店。
这意味着以下将是一个完全有效的实现:
let currentState = store.state
let action: Action = {
if currentState.someSubstate == "A" {
return ActionWhenInStateA()
} else {
return ActionWhenNotInStateA()
}
}
store.dispatch(action)
由于 ReSwift Stores 不应该接收来自不同线程的调度命令,因此您可以依赖第 1 行的状态与您调度的最后一行中的状态相同。
TL;DR:您不需要ActionCreator 来实现这一点。但是,如果您喜欢编写“面向东方”的代码,则可以使用回调而不是属性查询:
store.dispatch { state, _ in
if state.someSubstate == "A" {
return ActionWhenInStateA()
} else {
return ActionWhenNotInStateA()
}
}