Swift-ReSwift订阅多个子状态
我在我的项目中使用ReSwift来获得一个漂亮而干净的redux架构 由于我对整个状态不感兴趣,我只为我的viewcontroller订阅了两个子状态: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
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){
句柄(状态)
}
}
我相信这是正确的方法-每个对象处理单个状态。干杯