Swift - ReSwift订阅多个子状态

时间:2018-06-14 14:22:31

标签: swift redux render flux reswift

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

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

var fr = new FileReader();
fr.onloadend = function(){
  //fr.result will be an ArrayBuffer so create an Int8Array view
  var data = new Int8Array(fr.result);
  //use data as you wish.
};
fr.readFileAsArrayBuffer(file.files[0]);

会发生什么:

每次任何更新发生在商店时,都会调用我的newState方法。

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

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")
    }

}

有人可以解释为什么会这样吗?

谢谢和问候!

2 个答案:

答案 0 :(得分:1)

您可以在选择调用后使用skipRepeats。

问题是当子状态更改时仅需要更新状态时,可以使用skipRepeats检查是否为真,否则将跳过更新,请看下面的代码以尝试理解。

示例代码

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

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

如果您的过滤器没有任何变化,此代码将阻止调用newState

我希望对您有帮助

答案 1 :(得分:0)

请勿将整个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() }
    }
}

您的dataProviders当然必须是StoreSubscribers:

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

class DataProviderB: StoreSubsciber<SubStateB> {
    func newState(state: SubStateB) {
         handle(state)
    }
 }

我相信这是正确的方法-每个对象处理单个状态。干杯!