前言:html
1.基本目的 ios
将视图和数据分离开来,下降藕荷度编程
(1)Model : (数据模型,数据)持有并负责管理数据:封装,存储,处理数据运算等设计模式
(2)View : (视图,显示) 显示UI呈现给用户,对用户的target action 行为 有响应缓存
(3)Controller :(控制器,管理中心)调度程序工做,调解Model和View之间的交互 ,所有的表示逻辑、业务逻辑都在此 eg网络请求、事件响应方法网络
1)Model 和 View 永远不能相互通讯,只能经过 Controller 传递。架构
2)Controller 能够直接与 Model 对话(读写调用 Model),Model 经过 Notification 和 KVO 机制与 Controller 间接通讯。函数
3)Controller 能够直接与 View 对话,经过 outlet,直接操做 View,outlet 直接对应到 View 中的控件,View 经过 action 向 Controller 报告事件的发生(如用户 Touch 我了)。Controller 是 View 的直接数据源(数据极可能是 Controller 从 Model 中取得并通过加工了)。Controller 是 View 的代理(delegate),以同步 View 与 Controller。单元测试
4.优势学习
(1)实现了基本目的:将视图和数据分离开来,下降藕荷度
(2) 方便debug调试问题出处是Controller仍是View仍是Model
5. 缺点
(1)随着项目的不断迭代开发,Controller 承担业务量加大,负担变重。所以网上说起MVVM好处时候难免都diss一下MVC是“Massive View Controller(重量级视图控制器)”
(2) 较差的可测试性
(3) 遗失的网络逻辑 //太重的Controller 被堆砌,很难从堆砌的网络逻辑中查找对应哪个具体UI展现的
6.目前,咱们作的尽量给Controller 减负的方式
(1)遵循基本OC编码规则,明确函数分组和协议实现中使用#pragma mark -
来分类方法。好处来讲,代码结构清晰。不论厚重与否,咱们都遵循统一编码规则,从review,迭代的角度,都是相对有利的
(2) 使用类别category,来管理控制器中的业务,一个业务一个同级别类别category。 例如首页元素:
这些丰富的数据源来一个或者多个接口,UI展现出来有其特有的位置,因而选择使用类别category的方式来处理。
注意:使用类别只能离散化代码,逻辑层面更优秀一些,但不能真正减轻ViewController的负担。绝对依赖,仍是有问题。进一步优化仍是值得深挖挖
(3)分离数据源:实现 UITableViewDataSource 代理 协议相关的代码封装成一个类。这个我以前写过一个博客 参考连接2。
注意:这种方法最好是团队合做在开发上有交集,要绝对你们都知晓你这么作,并能认同这种优化方式,不然一个后果是,别人读不懂你的代码,同事又写了一遍。。。反而这种分离数据源的方法是一种过渡设计了
(4)使用一些优秀第三方减小代码量
eg. Masonry:在纯代码手动
代码设置视图的约束时,优秀得无可挑剔
YYKit系列:真是业内大牛利用本身学习心得开源出来的,很是牛逼,阅读一遍源码,本身再进行开发时候都下笔若有神的感受。
其中YYModel真是比本身写的那个反射好多了,足够面向对象,足够优秀,忽然在大神面前感受本身就是渣渣。继续努力,保持对学习进步的热忱之心
(5)尊重面相对象,该封装的方法,模块都进行封装。
eg.好比AFNetWorking ,作好封装。把相近业务网络请求部分放进一个类别里面,在控制器中直接调用咱们本身的封装便可
(1)Model : 数据层 和MVC中model同样
(2)ViewController/View: 展现层 它包括了一些数据绑定,事件,和行为 和 UI展现给用户 (ViewController只作了部分胶水做用,View仍是纯展现,触发事件响应给)
(3)ViewModel :数据模型 封装业务逻辑,业务网络处理,封装数据缓存,即把MVC中 控制器中的以上三部分等放到ViewModel里面