当将ReSwift与子状态一起使用时,当另一个子状态更新时,我如何避免收到不必要的子状态更新



当将ReSwift与子状态一起使用时,当更新另一个子状态(SubsteB(时,如何避免接收到不需要的子状态更新(SubsteA(

我以为这就是全部的重点,haven substates。。。

State.swift

struct MainState: StateType {
var subStateA: SubstateA?
var subStateB: SubstateB?
}
struct SubstateA: StateType {
let value: String
}
struct SubstateB: StateType {
let value: String
}

Store.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)

行动。快速

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?
}

虽然我为SubsteB发送了一个更新操作,但当SubsteA更新时,我也会收到newState事件

控制台

SubstateB updated
SubstateB updated
SubstateB updated

这个问题很老,但也许答案对某人有用。

订阅可以是:

mainStore.subscribe(self)  { $0.select { $0.subStateB }.skipRepeats(==) }

变电站B应符合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"

最新更新