我在我的项目中使用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)) {}
有人能解释为什么会发生这种事吗?
谢谢和问候!
发布于 2018-07-10 16:35:31
您可以在选择调用之后使用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
。
我希望能帮上忙
发布于 2019-03-13 13:37:36
只是不要订阅整个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)
}
}
我相信这是正确的方法--每个对象都处理单个状态。干杯!
https://stackoverflow.com/questions/50859750
复制相似问题