RxSwift 23 RxSwift 在 MVVM 架构中的应用

摘自 RxSwift - Reactive Programming with Swift 一书第 23 章.

传统 MVC 的缺点在于很容易将 Controller 中塞满代码, 因为除了视图控制逻辑, 还有一些弱业务逻辑在其中, 从而导致 Controller 不断变大, 导致后期难于维护.

所以在现实中需要一种新的架构来解决这一问题.

MVVM 简介

在 MVVM 中添加了一个新的角色: ViewModel

RxSwift 23 RxSwift 在 MVVM 架构中的应用_第1张图片
MVVM示意

如上图所示, View Model 在这个架构中处于核心地位, 在其中处理业务逻辑, 并且充当 Model 和 Controller 的中介.
MVVM 中各角色描述:

  • Models: 其中的类并不与其他角色中的类直接交流(耦合), 当自身的数据变化时, 可以使用通知机制等方式来与外界沟通.
  • View Models: 作用是与 Models 沟通, 并将数据暴露给 View Controllers.
  • View Controllers: 只与 View Models 和 Views 有联系, 负责管理视图生命周期, 并进行 UI 绑定.
  • Views: 当某事件发生时, 负责将事件传递给 View Controller.

上述职责分工中, VM 的职责类似 MVC 中的 C, 但实际应用时有一定的区别.

前面也说到, MVC 中的 C 由于插入太多非视图控制代码, 导致体积不断增大, 故 MVVM 中的做法是将 View 和 Controller 绑定在一起, Controller 中只包含视图控制逻辑, 即控制器只负责控制视图.

进行这样的职责分离后, 以前在控制器中的弱业务逻辑现在就转移到了 VM 中. 清晰的职责分工也让单元测试更加容易.

另外, 由于 VM 的存在, 将 app 中的其他部分完全与表示层隔离, 提高了代码的可重用性. 例如, 可以很容易地替换掉 View 和 对应的 Controller, 保持其他组分不变, 将应用从 iOS 平台迁移到 mac 平台.

在编码时, 一个最佳实践是将 VM 的依赖在构造时候进行注入.

MVVM 的好处在于它让文件更小, 职责更分明, 当结合 RxSwift 和 RxCocoa 使用时, 和传统 MVC 对比, 还有以下优点:

  • View Controller 现在的职责和它的名字一样, 只负责控制视图. 并且利用 Rx, 可以将视图和控制器进行绑定(bind).
  • ViewModel 中拥有清晰的 Input---> Output 模式. 这样的模式便于测试, 因为测试数据非常容易构造, 并且结果可预测:
    RxSwift 23 RxSwift 在 MVVM 架构中的应用_第2张图片
    对 VM 的测试
  • 对 View Controller 的测试同样简单, 因为可以构造 mock view model, 然后测试相应的 view controller 状态变化:
RxSwift 23 RxSwift 在 MVVM 架构中的应用_第3张图片
对 VC 的测试

你可能感兴趣的:(RxSwift 23 RxSwift 在 MVVM 架构中的应用)