MVVM框架思想

1.MVVM是什么?
M:模型
V:视图
VM:视图模型

简单理解:mvc是一个cell面向一个model开发
mvvm是一个cell面向一个viewModel开发, viewModel里面又包含model
mvvm优点:抽取方法更加的详细,业务逻辑划分更加明确,让控制器更加轻量级
缺点:不利于维护,可读性不太好

2.MVVM框架的使用(以计算不等高cell为例)
上面的分析指导,计算cell高度要在网络请求里面记性

2.1自定义一个topView模型
定义成员属性接收服务器返回(要展示到view上)的数据

2.2自定义一个viewModel模型
先定义一个topView的模型属性,来保存模型数据
在定义一些属性,来保存计算出来的数据(比如:cell的高度和frame)

2.3数据请求成功,先把我们需要的字典数组转成模型数组

2.4再把模型数组转换成 视图模型 数组,并保存起来(定义一个数组成员变量)

1 // 模型转视图模型
2 for (XMGThemeItem *item in themes) {
3 XMGThemeViewModel *vm = [[XMGThemeViewModel alloc] init];
4 // 计算cell子控件frame和cellH
5 vm.item = item;
6 [self.themeViewModels addObject:vm];

注意:给视图模型赋值的时候(vm.item = item;),会触发视图模型成员属性item的set方法
我们就是在item的set方法里面计算cell的frame和高度的,
也就是说,模型全部转为视图模型之后,cell的frame和高度已经全部确定了
只需要在视图模型定义成员属性保存frame和高度,用的这时候直接取就可以了

3.怎么展示数据?

3.1在自定义cell里面定义 一个视图模型来接收数据

3.2在cellForRow方法里面给cell的视图模型赋值(通过从数组中取出对应的视图模型)

1 cell.vm = _themeViewModels[indexPath.row];

3.3在给cell的视图模型赋值的时候,会触发vm的set方法,会调用vm的set方法
在set方法里面给topView的模型赋值,并取出cell的frame和高度

1 - (void)setVm:(XMGThemeViewModel *)vm
2 {
3 _vm = vm;
4 // topView:传递模型
5 _topView.item = vm.item;
6 // 设置topViewFrame
7 _topView.frame = vm.topViewFrame;
8 }

3.4怎么给模型赋值(也就是展示数据)
在setVm方法里面会触发模型的set方法_topView.item = vm.item;
也就是说,这句代码,就把视图模型保存的服务器数据,传递给topView中定义的模型属性

3.5在topView的item的set方法里面,我们完成给cell的子控件赋值的过程

1 - (void)setItem:(XMGThemeItem *)item
2 {
3 _item = item;
4 
5 [_iconView sd_setImageWithURL:[NSURL URLWithString:item.profile_image]];
6 _nameView.text = item.name;
7 _timeView.text = item.create_time;
8 _textView.text = item.text;
9 }

topView的这些子控件通过从xib连线获得

3.6在哪里给cell的高度赋值?
在heightForRow方法里面

1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;0


1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3 XTThemeViewModel *vm = _themeViewModels[indexPath.row]; 4 return vm.cellH; 5 }
原文地址:https://www.cnblogs.com/xiaotian666/p/5742592.html