【发布时间】:2019-06-19 01:55:58
【问题描述】:
我在我的项目中使用 MVVM、Clean Architecture 和 RxSwift。有一个视图控制器,它有一个子 UIView,它是从一个单独的 .xib 文件动态创建的(因为它在多个场景中使用)。因此有两个视图模型,UIViewController 的视图模型和 UIView 的。现在,子视图模型中有一个 Rx 事件,父视图模型应该观察到它,然后它将调用它的一些及其视图模型的函数。代码是这样的:
MyPlayerViewModel:
class MyPlayerViewModel {
var eventShowUp: PublishSubject<Void> = PublishSubject<Void>()
var rxEventShowUp: Observable<Void> {
return eventShowUp
}
}
我的播放器视图:
class MyPlayerView: UIView {
var viewModel: MyPlayerViewModel?
setup(viewModel: MyPlayerViewModel) {
self.viewModel = viewModel
}
}
MyPlayerSceneViewController:
class MyPlayerSceneViewController: UIViewController {
@IBOutlet weak var myPlayerView: MyPlayerView!
@IBOutlet weak var otherView: UIView!
var viewModel: MyPlayerSceneViewModel
fileprivate var disposeBag : DisposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.myPlayerView.viewModel.rxEventShowUp.subscribe(onNext: { [weak self] in
self?.viewModel.doOnShowUp()
self?.otherView.isHidden = true
})
}
}
如您所见,目前,我将 myPlayerView 的 viewModel 公开给公众,以便父级可以观察其上的事件。这是正确的方法吗?如果没有,还有其他关于更好方法的建议吗?谢谢。
【问题讨论】:
-
同时使用 MVVM 和 Clean Architecture 是什么意思?
-
基本上我使用的是带有 Clean Architecture 的 MVVM,使用 RxSwift 作为从一层到上一层的数据绑定(例如,从模型到视图模型,从视图模型到视图),如下所示:github.com/sergdort/CleanArchitectureRxSwift