【问题标题】:Swift - ReSwift Subscribe to multiple substatesSwift - ReSwift 订阅多个子状态
【发布时间】:2018-11-24 08:45:33
【问题描述】:

我在我的项目中使用 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)) {}

谁能解释为什么会这样?

谢谢和问候!

【问题讨论】:

    标签: swift redux render flux reswift


    【解决方案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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      只是不要将整个 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)
          }
       }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        相关资源
        最近更新 更多