Swift-ReSwift订阅多个子状态

Swift-ReSwift订阅多个子状态,swift,redux,render,flux,reswift,Swift,Redux,Render,Flux,Reswift,我在我的项目中使用ReSwift来获得一个漂亮而干净的redux架构 由于我对整个状态不感兴趣,我只为我的viewcontroller订阅了两个子状态: extension ViewController: StoreSubscriber { override func viewWillAppear(_ animated: Bool) { store.subscribe(self) { $0.select { ($0

我在我的项目中使用ReSwift来获得一个漂亮而干净的redux架构

由于我对整个状态不感兴趣,我只为我的viewcontroller订阅了两个子状态:

extension ViewController: StoreSubscriber {

    override func viewWillAppear(_ animated: Bool) {
        store.subscribe(self) {
            $0.select {
                ($0.subStateA, $0.subStateB)
            }
        }
    }

    override func viewWillDisappear(_ animated: Bool) {
        store.unsubscribe(self)
    }

    func newState(state: (subStateA: SubStateA, subStateB: SubStateB)) {
        print("test")
    }

}
发生了什么:

每当存储发生任何更新时,都会调用我的newState方法

例如,如果我更新subStateC,它仍然会触发

func newState(state: (subStateA: SubStateA, subStateB: SubStateB)) {}
有人能解释为什么会这样吗


谢谢和问候

您可以在选择调用后使用SkipPrepeats

这个问题是当你只需要更新状态,如果子状态被改变,使用SkipPrepeats你可以检查这是否正确你将跳过更新,看看这段代码来尝试理解

示例代码

这是一个关于导航状态的简单代码,我们希望在导航状态更改时更新状态

    store.subscribe(self) { (subscriber:Subscription<State>) -> Subscription<RoutingState> in
        subscriber.select({ (state:State) -> RoutingState in
            return state.routing;
        }).skipRepeats({ (oldRoutingState, newRoutingState) -> Bool in
            return oldRoutingState.navigationState == newRoutingState.navigationState
        })
    }
store.subscribe(self){(订阅者:subscribe)->中的订阅
在中选择({(状态:state)->RoutingState
返回状态。路由;
}).skipRepeats({(oldRoutingState,newRoutingState)->Bool in
返回oldRoutingState.navigationState==newRoutingState.navigationState
})
}
如果过滤器中没有任何更改,此代码将阻止调用
newState


我希望这会有所帮助,只是不要将整个ViewController或ViewModel订阅到状态。 您可以为您需要的每个状态创建子类(例如DataProvider)-订阅者

ViewController: UIViewController {
    let dataProviderA = DataProviderA()
    let dataProviderB = DataProviderB()

    func viewDidLoad() {
        super.viewDidLoad()
        store.subscribe(self.dataProviderA) { $0.select { state in state.subStateA }. skipRepeats() }
        store.subscribe(self.dataProviderB) { $0.select { state in state.subStateB }. skipRepeats() }
    }
}
当然,您的数据提供程序必须是StoreSubscribers:

class DataProviderA: StoreSubsciber<SubStateA> {
    func newState(state: SubStateA) {
         handle(state)
    }
 }

class DataProviderB: StoreSubsciber<SubStateB> {
    func newState(state: SubStateB) {
         handle(state)
    }
 }
class DataProviderA:StoreSubsciber{
func新闻状态(状态:子状态A){
句柄(状态)
}
}
类DataProviderB:StoreSubsciber{
func newState(状态:子状态B){
句柄(状态)
}
}
我相信这是正确的方法-每个对象处理单个状态。干杯