第二部分:MVVM 在 SwiftUI 中的实现
第6章:MVVM 的数据流
单向数据流的设计
核心概念
单向数据流(Unidirectional Data Flow)是 MVVM 架构中数据流动的核心模式,其核心原则是:
- 数据单一来源:所有状态变化均源自单一可信数据源(通常是 ViewModel)
- 单向传递:数据从 Model → ViewModel → View 单向流动
- 事件反向传递:用户交互事件通过 View → ViewModel → Model 路径反馈
SwiftUI 中的实现机制
class TodoViewModel: ObservableObject {
@Published var items: [TodoItem] = [] // 数据源
func addItem(_ text: String) {
let newItem = TodoItem(text: text)
items.append(newItem) // 唯一修改入口
}
}
struct TodoListView: View {
@ObservedObject var viewModel: TodoViewModel
var body: some View {
List(viewModel.items) { item in
Text(item.text)
}
}
}
设计优势
- 可预测性:状态变化路径明确,易于追踪
- 可测试性:所有状态变更都集中在 ViewModel
- 一致性:视图永远反映当前数据状态
典型数据流场景
- 初始化流程:
Model → ViewModel(初始化数据) → View(渲染) - 用户交互流程:
View(按钮点击) → ViewModel(处理逻辑) → Model(更新数据) → View(自动更新)
注意事项
- 避免在 View 中直接修改
@Published属性 - 使用
private(set)控制 Model 的可变性 - 复杂场景可结合
PassthroughSubject处理事件流
调试技巧
.onReceive(viewModel.$items) { newValue in
print("数据变化:", newValue)
}
关键点:单向数据流不是禁止双向绑定,而是通过受控的方式管理双向数据流动,所有状态变更都应通过 ViewModel 进行中介处理。
