RxSwift世界中的ViewModel
牢记这一点,我想将ViewModel视为一个“黑匣子”,它接受一些UI触发器(按钮点击,表视图选择,文本编辑事件等),其他依赖项(NeworkService,DataBaseService,LocationService)并应用一些Rx运算符(确定业务逻辑)。 然后,从视图模型中,您可以获取转换后的可观察对象,并将其绑定回您的UI以应用您的业务逻辑。
作为示例,我想展示如何实现可搜索数据列表,并在带有搜索栏的表格视图中显示它
假设所有实现模型的人员都要做的就是创建ViewModel和ViewController
因此,让我们定义UI触发器:
- 搜索触发器(用户可以键入以搜索列表中的数据)
- 滚动触发器(用户可以滚动以从列表中提取新数据)
现在我们可以定义ViewModel接口
现在让我们定义要应用于初始触发器的转换
- 从搜索查询转换为请求
- 防止触发空查询请求
- 防止用户每次输入新字符时发出火灾指令
- 取消先前的请求以支持新请求
- 每次用户滚动到滚动视图的底部边缘时都命中请求
- 用新数据附加先前状态(数组)
实施转换:
- 过滤空字符串,请记住我们不要触发空查询的请求
- 防止用户每次输入新字符时触发请求,仅在暂停0.3秒时才触发
- 将搜索查询转换为请求并取消之前的查询
- 将英雄转变为 虚拟HeroCellData (例如标题,图像网址)
- 将HeroCellData数组转换为HeroCellSection (这需要将其绑定到UITableView)
- 触发下一页请求
现在让我们将转换后的Observable绑定回UI
- 创建ViewModel
- 将主表项绑定到UITableView
- 将搜索项绑定到UISearchController的tableView
摘要:
- 我们的视图模型是“纯”的,它是不可变的,我们甚至不需要在ViewController中对其进行引用( disposeBag使订阅保持活动状态)
- 所有逻辑封装在一个地方
- 可以使用RxTests轻松测试它。 在下一篇文章中🙂
进一步阅读:
- Rx简介
- RxSwift书
- Rx.io
- RxDataSources
- 原始码
快乐的RxSwift编码! 🙂