防止RxSwift中的冗余操作

问题描述 投票:2回答:1

我从RxSwift开始我的冒险,已经对js的React有了很少的经验。我认为我的问题很普遍,但是我不确定如何以简洁的抽象方式来描述它,因此我将在示例中对其进行描述。

我正在构建显示一些图表的iOS应用。感兴趣的部分包括ChartAreaController和ChartInfoController,它们都嵌入在ChartController中。第一个控制器是显示某些图形的区域(基于rx chartData属性),第二个控制器将具有一个滑块,供用户限制显示x值(rx selectedXRange属性),该值限制在最小和最大之间。最小/最大值由当前图表数据定义。

在ChartController中定义了滑块更改更新图表时的行为:

override func viewDidLoad() {
   super.viewDidLoad()
   (...)
   chartInfoController.selectedXRange.asObservable()
                .subscribe(onNext: { [unowned self] selectedXRange in
                    (...)
                    let chartData = self.filterChartData(from: self.rawChartData, in: selectedXRange)
                    self.chartAreaController.chartData.accept(chartData)
                }).disposed(by: disposeBag)

filterChartData()方法只是过滤掉不在该范围内的数据,但是出于参数的考虑,我们可以假定它非常昂贵,并且我不希望它在不需要时运行两次。

[当用户更改要显示的图表时,新数据从服务器(还是ChartController)到达:

private func handleNewData(_ rawChartData: ChartData) {
        self.rawChartData = rawChartData

        guard let allowedXRange = rawChartData.xRange() else { return }
        let selectedXRange = chartInfoController.selectedXRange.value
        let newSelectedXRange = calculateSelectedXRange(currentSelectedDays: selectedDaysRange, availableDaysRange: daysRange)
        let chartData = filterChartData(from: rawChartData, in: selectedXRange)

        self.chartInfoController.allowedXRange = allowedXRange //this line is not crucial
        self.chartInfoController.selectedXRange.accept(newSelectedXRange)

        self.chartAreaController.chartData.accept(rawChartData)
    }

因此,在新图表数据到达时,可能会由于数据的新的最小/最大值而必须修整当前选定的xRange。因此,该方法的副作用将是更改selectedXRange并依次运行我先前粘贴的订阅。因此,当新数据到达时,chartData将更新两次,我不希望发生这种情况。

当然,我可以注释掉handleNewData()方法的最后一行,但是我不太喜欢它,因为handleNewData()存在的主要原因是设置chartData,并注释掉了它的目标由于该方法的副作用(正在更新滑块)而得以实现。不可接受。

向chartData我仍然添加了节流阀,因为快速移动的滑块将导致许多更新,并且这部分解决了我的问题(chartData仅更新了一次)。但是,您可能还记得filterChartData()方法的成本很高,并且该部分仍将运行两次。

所以一个问题是,如果我解决该问题的总体布局是否可以,还是应该以不同的方式处理?在这一点上,我得出的结论是,我正在寻找某种方式来临时禁用selectedXRange上的特定订阅(而不损坏对该变量的其他订阅)。临时含义:

(...)
//disable subscription
self.chartInfoController.selectedXRange.accept(newSelectedXRange)
self.chartAreaController.chartData.accept(rawChartData)
//enable subscription
(...)

在我看来这是合法的,因为ChartController作为订阅的所有者和值的更改者可能希望在适合他的时候禁用订阅(它?)。>

RxSwift是否支持这种功能?如果没有的话,我想我可以自己实现,例如通过ChartController中的bool属性,或通过将预订添加到单独的disposeBag中,我将对其进行处置,然后重新创建该预订。但是,这是一件好事吗?例如,当有一些错误时,布尔型溶液可能很容易受到不适,并且处置/重新创建可能会花费一定的成本,并且在某些情况下,可能不希望这样处置。

是否有更好的做法来处理这种情况?正如我说的那样,我认为问题很普遍,因此我希望有一个规范的解决方案:)谢谢您的回答,对于冗长的帖子,我们深表歉意。

我从RxSwift开始我的冒险,已经对js的React有了很少的经验。我认为我的问题很普遍,但是我不确定如何以简洁的抽象方式来描述它,所以我...

ios swift reactive-programming rx-swift rx-cocoa
1个回答
0
投票

所以一个问题是,如果我解决该问题的总体布局是否可以,还是应该以不同的方式处理?

© www.soinside.com 2019 - 2024. All rights reserved.