我从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有了很少的经验。我认为我的问题很普遍,但是我不确定如何以简洁的抽象方式来描述它,所以我...
所以一个问题是,如果我解决该问题的总体布局是否可以,还是应该以不同的方式处理?