1

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

因为我对整个状态不感兴趣,所以我只为我的视图控制器订阅了两个子状态:

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

谁能解释为什么会这样?

谢谢和问候!

4

2 回答 2

1

您可以在 select 调用后使用 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如果您的过滤器没有任何变化,此代码将阻止调用。

我希望有帮助

于 2018-07-10T16:35:31.110 回答
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)
    }
 }

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

于 2019-03-13T13:37:36.767 回答