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. UDP 构建p2p打洞过程的实现原理(持续更新)

    UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55)   阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...

  2. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  3. Memory Allocation in the MySQL Server

    https://dev.mysql.com/doc/internals/en/memory-allocation-mysql-server.html MySQL Internals Manual  / ...

  4. 【ZBar】ios错误ignoring file xxx missing required architecture x86_64 in file

    解决方法: 1.在Project target里"Architectures"设置为:Standard (armv7,armv7s)或者  Standard (armv7,arm6 ...

  5. 【Android测试】【随笔】与 “美丽说” 测试同事交流

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5405432.html 分享者简介 雪晗,3年+测试经验,现 ...

  6. Bulk Insert & BCP执行效率对比(续)

    上回由于磁盘空间(约70G)不足,导致Bulk Insert和BCP导入中途失败:今次统一一些操作,以得到Bulk insert与BCP分别执行效率: 1. 15435390笔数据,21.7G csv ...

  7. 转:[ASP.NET]重構之路系列v4 – 簡單使用interface之『你也會IoC』

    前言 上次v3版本,我們將Entity, Service, Dao, Utility都放到了類別庫裡面,讓我們可以輕鬆的在不同專案中用同一份組件.雖然文章沒有獲得太多的讚賞,不過相信那一定是太多人會這 ...

  8. 如何对抗 WhatsApp「蓝色双勾」-- 3 个方法让你偷偷看讯息

    WhatsApp 强制推出新功能「蓝色双勾 (✔✔)」 ,让对方知道你已经看过讯息.一众用户反应极大,因为以后不能再藉口说未看到讯息而不回覆.究竟以后 WhatsApp 是否真的「更难用」? 幸好还有 ...

  9. 【C++】利用指针实现通过函数改变多个参数的值

    写惯了python,对于C++的语法越来越生疏,不同于python中函数可以return多个变量,C++的函数要想返回多个参数可以利用指针实现. 因为在函数内部的变量都是局部变量,所以当参数传入函数中 ...

  10. LightOj1388 - Trapezium Drawing(求梯形点的坐标)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1388 题意:已知梯形的点A B的坐标,以及b c d的长度,求C D两点的坐标:默认A ...