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再把模型数组转换成 视图模型 数组,并保存起来(定义一个数组成员变量)

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

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

3.怎么展示数据?

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

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

 cell.vm = _themeViewModels[indexPath.row];

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

 - (void)setVm:(XMGThemeViewModel *)vm
{
_vm = vm;
// topView:传递模型
_topView.item = vm.item;
// 设置topViewFrame
_topView.frame = vm.topViewFrame;
}

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

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

 - (void)setItem:(XMGThemeItem *)item
{
_item = item; [_iconView sd_setImageWithURL:[NSURL URLWithString:item.profile_image]];
_nameView.text = item.name;
_timeView.text = item.create_time;
_textView.text = item.text;
}

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

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

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

1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
XTThemeViewModel *vm = _themeViewModels[indexPath.row];
return vm.cellH;
}

MVVM框架思想的更多相关文章

  1. MVVM框架理解

    MVC框架 将整个前端页面分成View,Controller,Modal,视图上发生变化,通过Controller(控件)将响应传入到Model(数据源),由数据源改变View上面的数据. 整个过程看 ...

  2. vue.js学习笔记(一):什么是mvvm框架,vue.js的核心思想

    一:MVVM框架 MVVM框架的应用场景:  1.针对具有复杂交互逻辑的前端应用 2.提供基础的架构抽象 3.提供ajax数据持久化,保证前端用户体验 二:vue.js的核心思想 (一):数据驱动 ( ...

  3. “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...

  4. 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质

    最近前端圈子里面,发现大家都在热炒概念,什么knockout,angularJs,都被捧成神了,鄙人不才,最近心情也不好,特地写这篇文章来找骂 写代码的码农都知道,Java社区虽然不是一个提出分层思想 ...

  5. 我所知道的MVVM框架(转 司徒大大 )

    RubyLouvre commented on 6 Sep 2014   avalon http://avalonjs.github.io/ (使用Object.defineProperties. V ...

  6. Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)

    1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...

  7. SPA和MVVM设计思想

    Vue基础篇设计模式SPAMVVMVue简介Vue的页面基本使用Vue的全局环境配置基本交互 插值表达式基础指令 v-text v-html v-pre v-once v-cloak v-on MVV ...

  8. Vue中的MVVM框架

    ViewModel:数据双向绑定 场景: 针对具有复杂交互逻辑的前段应用 提供基础的架构抽象 通过Ajax数据持久化,保证前端用户体验  什么是vue.js? 是一个轻量级的mvvm框架 数据驱动+组 ...

  9. iOS应用千万级架构:MVVM框架

    业务模块内的MVC和MVVM架构 目前,唯品会中MVC和MVVM架构并存,后期会偏重于MVVM架构的使用. MVC架构 Model:程序中要操纵的实际对象的抽象,为Controller提供经过抽象的业 ...

随机推荐

  1. 理解OAuth 2.0[摘]

    原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...

  2. linux下搭建SVN服务器完全手册【摘抄】

    系统环境        RHEL5.4最小化安装(关iptables,关selinux) + ssh + yum 一,安装必须的软件包.        yum install subversion ( ...

  3. Delphi中如何控制其他程序窗体上的窗口控件

    回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数 ...

  4. java override

    java override // 覆盖父类的方法,在子类直接调用子类内部这个方法时 public class TestCalc{ protected static class Wine{ String ...

  5. [qemu] 在前端驱动使用virtio的情况下,如何让后端使用vhost-user [未解决]

    首先,如果你更关心原理和知识,请读读这个 http://chuansong.me/n/2186528 (值得细细的逐字读). 在<<深入浅出dpdk>>中提到,vhost-us ...

  6. [收藏]Asp.net MVC生命周期

    一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的? 以IIS7中asp.net应用程序生命周期为例,下图是来自M ...

  7. 【转】Swing 与EDT线程

    在Swing程序中,经常能看到如下这种代码: SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { text ...

  8. Difference between _, __ and __xx__ in Python

    When learning Python many people don't really understand why so much underlines in the beginning of ...

  9. 【Android测试】【随笔】搜狗、腾讯技术交流会心得

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5048525.html 今天没上班,一大早就起来赶去搜狐网络 ...

  10. Maximal Square || LeetCode

    dp. #define MAX 1000 int rowLeft[MAX][MAX]; int colUp[MAX][MAX]; int dp[MAX][MAX]; void calRow(char ...