【发布时间】:2017-11-04 03:12:25
【问题描述】:
我有来自不同视图控制器的数据(每个视图控制器都有一个单独的视图模型)并显示在主视图控制器中。如何使用 RxSwift 和 MVVM 实现一个视图控制器与主视图控制器之间的数据传递?
【问题讨论】:
我有来自不同视图控制器的数据(每个视图控制器都有一个单独的视图模型)并显示在主视图控制器中。如何使用 RxSwift 和 MVVM 实现一个视图控制器与主视图控制器之间的数据传递?
【问题讨论】:
我的回答是我不能代表 RxSwift。我建议您让两个 ViewModel 与您的应用程序的模型或其他控制器进行对话,以协调它们之间的数据。请记住,您希望能够独立于任何其他 ViewController 为每个 ViewController 类编写测试(至少从数据的角度来看 - 视图堆栈是另一回事)。并且您的 ViewController 测试应该让您交换模拟 ViewModel。您还希望能够独立于任何 ViewController 或任何其他 ViewModel 来测试每个 ViewModel。
因此,最好的办法是让您的 VC 简单地与他们的 ViewModel 进行合同对话。每个 ViewModel 还可以与外部模型、控制器和服务进行对话——最好以允许依赖注入的方式进行,这样您就可以在测试 ViewModel 时模拟这些控制器和服务。
通过在架构设计时始终牢记您的测试需求,您将快速推断出正确的方法。
【讨论】:
将 Navigator 对象注入到您的 ViewControllers 中。在给定所需数据参数的情况下,该对象应提供导航到每个 ViewController 的功能。例如:
func showSceneX(param1: String, param2: Int, sender: UIViewController) {
let vm = SomeViewModel(param1: param1, param2: param2)
let vc = SomeViewController.createWith(navigator: self, viewModel: vm)
// Show the desired view controller. from the previous one
sender.present(target, animated: true, completion: nil)
}
通过将此逻辑隔离到一个专用对象中,您可以从视图控制器中获得更大的灵活性,并且您可以根据需要为包含多个视图控制器的测试设置模拟。
【讨论】: