Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第二部分:MVVM 在 SwiftUI 中的实现

第二部分:MVVM 在 SwiftUI 中的实现

第6章:MVVM 的数据流

单向数据流的设计

核心概念

单向数据流(Unidirectional Data Flow)是 MVVM 架构中数据流动的核心模式,其核心原则是:

  1. 数据单一来源:所有状态变化均源自单一可信数据源(通常是 ViewModel)
  2. 单向传递:数据从 Model → ViewModel → View 单向流动
  3. 事件反向传递:用户交互事件通过 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)
        }
    }
}

设计优势

  1. 可预测性:状态变化路径明确,易于追踪
  2. 可测试性:所有状态变更都集中在 ViewModel
  3. 一致性:视图永远反映当前数据状态

典型数据流场景

  1. 初始化流程:
    Model → ViewModel(初始化数据) → View(渲染)
    
  2. 用户交互流程:
    View(按钮点击) → ViewModel(处理逻辑) → Model(更新数据) → View(自动更新)
    

注意事项

  1. 避免在 View 中直接修改 @Published 属性
  2. 使用 private(set) 控制 Model 的可变性
  3. 复杂场景可结合 PassthroughSubject 处理事件流

调试技巧

.onReceive(viewModel.$items) { newValue in
    print("数据变化:", newValue) 
}

关键点:单向数据流不是禁止双向绑定,而是通过受控的方式管理双向数据流动,所有状态变更都应通过 ViewModel 进行中介处理。

Last Updated:: 4/25/25, 8:13 PM