RxSwift世界中的ViewModel

牢记这一点,我想将ViewModel视为一个“黑匣子”,它接受一些UI触发器(按钮点击,表视图选择,文本编辑事件等),其他依赖项(NeworkService,DataBaseService,LocationService)并应用一些Rx运算符(确定业务逻辑)。 然后,从视图模型中,您可以获取转换后的可观察对象,并将其绑定回您的UI以应用您的业务逻辑。

作为示例,我想展示如何实现可搜索数据列表,并在带有搜索栏的表格视图中显示它

假设所有实现模型的人员都要做的就是创建ViewModel和ViewController

因此,让我们定义UI触发器:

  • 搜索触发器(用户可以键入以搜索列表中的数据)
  • 滚动触发器(用户可以滚动以从列表中提取新数据)

现在我们可以定义ViewModel接口

现在让我们定义要应用于初始触发器的转换

  • 从搜索查询转换为请求
  • 防止触发空查询请求
  • 防止用户每次输入新字符时发出火灾指令
  • 取消先前的请求以支持新请求
  • 每次用户滚动到滚动视图的底部边缘时都命中请求
  • 用新数据附加先前状态(数组)

实施转换:

  1. 过滤空字符串,请记住我们不要触发空查询的请求
  2. 防止用户每次输入新字符时触发请求,仅在暂停0.3秒时才触发
  3. 将搜索查询转换为请求并取消之前的查询
  4. 英雄转变为 虚拟HeroCellData (例如标题,图像网址)
  5. HeroCellData数组转换HeroCellSection (这需要将其绑定到UITableView)
  6. 触发下一页请求

现在让我们将转换后的Observable绑定回UI

  1. 创建ViewModel
  2. 将主表项绑定到UITableView
  3. 将搜索项绑定到UISearchController的tableView

摘要:

  • 我们的视图模型是“纯”的,它是不可变的,我们甚至不需要在ViewController中对其进行引用( disposeBag使订阅保持活动状态)
  • 所有逻辑封装在一个地方
  • 可以使用RxTests轻松测试它。 在下一篇文章中🙂

进一步阅读:

  • Rx简介
  • RxSwift书
  • Rx.io
  • RxDataSources
  • 原始码

快乐的RxSwift编码! 🙂