ios - RxSwift 子类化最佳实践
问题描述
我有一个在两个流程中使用的视图模型,并且已经到了应该将它真正拆分为一个超类和两个子类的阶段。但是,我对执行某些子类化的最佳方式感到困惑。
在创建视图模型时,我传递了视图中可能发生的所有交互,如下所示:
看法
class SomeViewController: UIViewController {
@IBOutlet private weak var nextButton: UIButton!
private var presenter: SomeViewModel!
override func viewDidLoad() {
super.viewDidLoad()
presenter.configure(nextButtonTapped: nextButton.rx.tap.asDriver())
}
}
然后我可以在我的视图模型中处理这些操作,如下所示:
视图模型
class SomeViewModel {
private let normalFlow: Bool
private let diposeBag = DisposeBag()
init(normalFlow: Bool) {
self.normalFlow = normalFlow
}
func configure(nextButtonTapped: Driver<Void>) {
handle(nextButtonTapped: nextButtonTapped)
// call to any other input handlers here...
}
func handle(nextButtonTapped: Driver<Void>) {
nextButtonTapped.drive(onNext: { [unowned self] in
guard self.safetyCheckOnePasses(), safetyCheckTwoPasses() else {
return
}
if normalFlow {
// do some set of actions
} else {
// do another set of actions
}
}).disposed(by: disposeBag)
}
func safetyCheckOnePasses() -> Bool {
// perform some sanity check...
return true
}
func safetyCheckTwoPasses() -> Bool {
// perform another sanity check...
return true
}
}
我对覆盖的最佳方法感到困惑,handle(nextButtonTapped: Driver<Void>)
因为我仍然希望在每个子类的开始时进行这些健全性检查onNext
,但我希望之后的主体对于不同的子类是不同的。在不复制代码的情况下,最好的方法是什么?
解决方案
Rx 是功能范式的一部分,因此,子类化是不合适的。
将您的safetyCheckOnePasses()
和safetyCheckTwoPasses()
函数移出类(或至少使它们成为静态的)。这样它们就可以在不需要实例的情况下被重用。
推荐阅读
- c++ - Visual Studio Code C++ 调试器不启动
- c++ - arduino 的 C++ 是否遵循标准?
- python - 从多个工作表 Excel 文件中检索到的 Dict 中删除一列
- python - How can I open a window if my given conditions are true?
- mysql - 如何对两个 SUMmed SQL 结果字段求和
- flutter - 颤振容器消失
- angular - Ag 网格向列标题中的过滤器添加第二个 OR 或 AND
- javascript - 是否使用 Js 删除运算符从被认为是不好的做法的对象中删除属性?
- java - 从多个 Entity 对象创建 EntityIterable
- javascript - 为什么我的功能组件没有重新渲染?