ios - 将 ReSwift 与子状态一起使用时,如何避免在更新另一个子状态时收到不需要的子状态更新?
问题描述
将 ReSwift 与子状态一起使用时,如何在更新另一个子状态 (SubstateB) 时避免接收不需要的子状态更新 ( SubstateA )
我虽然这就是重点,但有子状态......
状态.swift
struct MainState: StateType {
var subStateA: SubstateA?
var subStateB: SubstateB?
}
struct SubstateA: StateType {
let value: String
}
struct SubstateB: StateType {
let value: String
}
存储.swift
let mainStore = ReSwift.Store<MainState>(reducer: { action, state -> MainState in
var newState = state ?? MainState()
switch action {
case let anAction as UpdateSubstateA:
newState.subStateA = newState.subStateA ?? SubstateA(value: anAction.value)
case let anAction as UpdateSubstateB:
newState.subStateB = newState.subStateB ?? SubstateB(value: anAction.value)
default:
break
}
return newState
}, state: nil)
Actions.swift
struct UpdateSubstateA: Action {
let value:String
}
struct UpdateSubstateB: Action {
let value:String
}
ViewController.swift
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
mainStore.subscribe(self) { $0.select { state in (state.subStateB ) } }
mainStore.dispatch(UpdateSubstateA(value: "a"))
mainStore.dispatch(UpdateSubstateB(value: "b"))
}
}
extension ViewController: StoreSubscriber {
func newState(state: SubstateB?) {
print("SubstateB updated")
}
typealias StoreSubscriberStateType = SubstateB?
}
虽然我为 SubstateB 发送了一个更新操作,但当 SubstateA 更新时,我也会收到 newState 事件
安慰
SubstateB updated
SubstateB updated
SubstateB updated
解决方案
问题很旧,但也许答案对某人有用。
订阅可以是:
mainStore.subscribe(self) { $0.select { $0.subStateB }.skipRepeats(==) }
SubstateB 应符合 Equatable 协议:
extension SubstateB: Equatable {
static func == (lhs: Self, rhs: Self) -> Bool {
return lhs.value == rhs.value
}
}
安慰:
SubstateB updated - nil (initial value)
SubstateB updated - value: "b"
推荐阅读
- python - 如果使用 prefetch_related django,则为空 M2M 数据
- android - 图像在 Cardvew 中时不显示
- java - Spring StateMachine 可重用状态机实例
- angular - 有没有办法通过点击 ag-grid 中的扩展箭头将 agGroupCellRenderer 参数传递给自定义组件?
- email - 以 png 内嵌图像的形式发送电子邮件是否会增加我的隐私和抵抗被监视的能力?
- javascript - UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“hasPermission”
- python-3.x - 使用火炬时多处理速度慢
- java - 我在 google play 中发布的 android 应用程序带来购买而不是购买前安装
- javascript - React Native - 按下绝对定位的视图和焦点输入
- c++ - 使用参考从笛卡尔坐标转换为极坐标,从极坐标转换为笛卡尔坐标