文章目录
- 0.个人总结
- 1.MVVM实例解析
- 1.1 viewModel.loadData:控制器中有viewModel属性
- 1.2 WBStatusListViewModel类中loadData方法的实现,将[WBStatusModel]转成[WBStatusViewModel]存在属性dataSourceArr中
- 1.3 WBNetworkTool.shared.requestStatus网络请求方法的实现,返回模型数组[WBStatusModel]
- 1.4 viewModel.loadData方法产生回调后tableView.reloadData()
- 1.5 cell.statusViewModel = statuViewModel
- 下面的博客中有相关类的完整代码
- 2.viewModel处理model后给到view举例
- 参考博客
0.个人总结
- 输入(数据) 处理 输出(展示)
- 如果处理部分很简单就用 mvc
- 如果比较复杂就在分出一个 viewModel层,要控制器里面的代码变少一点,控制器就被划到View层里去了
- iOS的控制器就是MVC模式,swiftUI用的是MVVM模式
- 有些人按业务逻辑来进行大的分类,如图1
- 有些按设计模式进行大的分类,如图2
- 我倾向于按业务逻辑来进行大的分类,苹果系统应该也是这样设计的,就像下面的参考博客里斯坦福大学教授讲的,一个控制器就是一个MVC,如果比较复杂的控制器就用MVVM模式
简单的界面用MVC模式,复杂的用MVVM模式
- 图1
- 图2
1.MVVM实例解析
- viewModel对model进行了加工,个View更贴近,更适合view展示
- 用户进入界面后,控制器找viewModel层要数据,viewModel发起网络请求(蓝牙,wifi,本地),要到数据后将json数据转成model,又将model转成viewModel,方便控制器显示
1.1 viewModel.loadData:控制器中有viewModel属性
class WBHomeController: WBRootController {
/// viewModel
lazy var viewModel = WBStatusListViewModel()
1.2 WBStatusListViewModel类中loadData方法的实现,将[WBStatusModel]转成[WBStatusViewModel]存在属性dataSourceArr中
1.3 WBNetworkTool.shared.requestStatus网络请求方法的实现,返回模型数组[WBStatusModel]
1.4 viewModel.loadData方法产生回调后tableView.reloadData()
// MARK: - 重写父类的数据源和代理方法
extension WBHomeController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.dataSourceArr.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//判断使用哪一种cell
let statuViewModel:WBStatusViewModel = viewModel.dataSourceArr[indexPath.row]
1.5 cell.statusViewModel = statuViewModel
下面的博客中有相关类的完整代码
ios swift MVVM实例(Model-View-ViewModel)
2.viewModel处理model后给到view举例
-
计算行高
-
时间展示
-
处理VIP图标
/// 处理vip图标
func dealWithVipImage() {
if let verify_type = statusModel.user?.verified_type {
switch verify_type {
case 0:
//达人
vipImage = UIImage(named: "avatar_vip")
case 2, 3, 5:
//企业达人
vipImage = UIImage(named: "avatar_enterprise_vip")
case 220:
//草根达人
vipImage = UIImage(named: "avatar_grassroot")
default:
vipImage = nil
}
}
}