首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift - ReSwift订阅多个子状态

Swift - ReSwift订阅多个子状态
EN

Stack Overflow用户
提问于 2018-06-14 14:22:31
回答 2查看 892关注 0票数 1

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

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

代码语言:javascript
运行
复制
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,它仍然会触发

代码语言:javascript
运行
复制
func newState(state: (subStateA: SubStateA, subStateB: SubStateB)) {}

有人能解释为什么会发生这种事吗?

谢谢和问候!

EN

回答 2

Stack Overflow用户

发布于 2018-07-10 16:35:31

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

这个问题是,如果更改了子状态,则只需要更新状态,使用skipRepeats,您可以进行检查,如果这是真的,您将跳过更新,查看下面的代码以尝试理解。

示例代码

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

代码语言:javascript
运行
复制
    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
EN

Stack Overflow用户

发布于 2019-03-13 13:37:36

只是不要订阅整个ViewController或您的ViewModel状态。您可以为所需的每个状态创建子类(例如DataProvider) -订阅服务器。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
class DataProviderA: StoreSubsciber<SubStateA> {
    func newState(state: SubStateA) {
         handle(state)
    }
 }

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50859750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档