iOS 开发中利用 RxSwift 系统实现 MVVM(持续更新)

本文最后更新于 2021年4月4日 晚上

这里记录一下整个开发的历程.

公司需要进一步提高开发效率, 除了配备的 12 年 13 寸 mac, 其他都还行. 故开始学习 RxSwift 并应用到工程中.

1 抽取出两个基础协议

视图模型协议: 为了约束 Input/Output 模式, 故引入下面的这个协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// ViewModel 协议
///
/// 用于约束实际开发中的 ViewModel, 让它们尽量遵循 Input/Output 模式.
///
/// 但并非必须要让所有的 ViewModel 都实现这个协议.
protocol IViewModel {
associatedtype InputType
associatedtype OutputType

// var Input: InputType { set get }
// var Output: OutputType { get }

/// 输入输出转换方法
///
/// - Parameter input: ViewModel 的输入类型, ViewController 通过它内部的公共属性(可以是普通的变量或 Subject)提供输入.
/// - Returns: ViewModel 的输出类型, 内部包含了 ViewModel 可能的输出, ViewController 可以用这些输出来驱动(Drive)视图
func transform(input: InputType) -> OutputType
}

可绑定视图模型的类型需要实现下面的协议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// 可绑定视图模型的类型
///
/// 由于在 iOS 内只有 ViewController 有绑定 ViewModel 的需求, 所以将这个协议设置为 class 可实现.
protocol ViewModelBandable: class {
associatedtype ViewModelType

/// 自己对应的 ViewModel
///
/// 由于 ViewModel 并非必须在 View 初始化的时候就存在, 但使用时必须有 ViewModel
/// 故设置为可选类型(隐式已解包)
var viewModel: ViewModelType! { set get }

/// 执行具体的 View 同 ViewModel 间的绑定操作
func bind()
}

extension ViewModelBandable where Self: UIViewController {
/// 将指定 ViewModel 设置到 View, 并调用 ViewModelBandable 的 bind() 操作.
///
/// - Parameter viewModel: ViewModel
func bindViewModel(_ viewModel: Self.ViewModelType) {
self.viewModel = viewModel
// 保证在正确的时机后才会进行绑定操作, 否则
loadViewIfNeeded()
self.bind()
}
}

2 利用 RxCocoa 为 TableView 提供数据源

在实际开发中这个需求很常见, 一般来说按照如下套路走即可.

待续.


iOS 开发中利用 RxSwift 系统实现 MVVM(持续更新)
https://blog.rayy.top/2018/11/22/2019-20-rx-MVVM/
作者
貘鸣
发布于
2018年11月22日
许可协议