iOS 设计模式:MVVM

MVVM(Model View View-Model):

一种可以很好地解决Massive View Controller (臃肿的视图控制器)问题的办法就是将Controller中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel。MVVM衍生于MVC,是对MVC的一种演进,它促进了UI代码与业务逻辑的分离。它正式规范了视图和控制器耦合的性质,并引入新的组件。他们之间的结果关系如下:


  • MVVM的基本概念

** 在MVC中,view和view controller 正式联系在一起,我们把它们视为一个组件
** view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel)
** viewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方
**使用MVVM会轻微的增加代码量,但总体上来减少代码的复杂性

  • MVVM的注意事项

** view 引用 viewModel,但反过来不行(即不要再viewModel 中引入 #import UIKit.h,任何视图本身的引用都不应该放在viewModel 中)(PS:基本要求,必须满足)
** viewModel 引用 model,但反过来不行

  • MVVM的使用建议
** MVVM可以兼容你当下使用MVC架构。

** MVVM增加你的应用的可测试行。

** MVVM 配合一个绑定机制效果最好(PS:ReactiveCocoa你值得拥有)。

** viewController 尽量不涉及业务逻辑,让 viewModel 去做这些事情。

** viewController 只是一个中间人,接收view的事件、调用viewModel的方法、响应viewModel的变化。

** viewModel 绝对不能包含视图view(UIKit.h)不然跟view产生了耦合,不方便复用和测试。

**viewModel之间可以有依赖。

**viewModel避免过于臃肿,否则重蹈controller的覆辙,变得难以维护。

  • MVVM的优势

** 低耦合:view可以独立于model变化和修改,一个viewModel可以绑定到不同的view上

**可重用行:可以把一些视图逻辑放在一个viewModel里面,让很多view重用这段视图逻辑

**独立开发:开发人员可以专注于业务逻辑和数据的开发viewModel,设计人员可以专注于页面设计

**可测试:通常界面是比较难于测试的,而MVVM模式可以针对viewModel来进行测试

  • MVVM的弊端

**数据绑定使得bug很难被调试。你看到界面异常了,有可能是你view的代码有bug,也有可能是model的代码有问题。数据绑定使得一个位置的bug被快速传递到别的位置,要定位原始出问题的地方就不那么容易了。

**对于过大的项目,数据绑定和数据转化需要花费更多内存(成本)。主要成本在于:

    *数组内容转化成本较高:数组里面每项都要转化成item对象,如果item对象中还有类似数组,就很头疼。

    *转化之后的数据在大部分情况是不能直接被展示的, 为了能够被展示,还需要第二次转化。

    *只有在API返回的数据高度标准化时,这些对象原型(item)的可复用程度才高,否则容易出现类型爆炸,提高维护成本。

    *调试时通过对象原型查看数据内容不如直接通过NSDictionary/NSArray直观。

    *同一API的数据被不同view展示时,难以控制数据转化的代码,它们有可能会散落在任何需要的地方。


总结
  • MVC的设计模式也并非是病入膏肓,无药可救的架构,最起码目前MVC设计模式仍旧是iOS开发的主流框架,存在即合理。针对文章所述的弊端,我们依旧有许多可行的方法去避免和解决,从而打造一个轻量级的ViewController
  • MVVMMVC的升级版,完全兼容当前的MVC架构,MVVM虽然促进了UI 代码与业务逻辑的分离,一定程度上减轻了ViewController的臃肿度,但是ViewViewModel之间的数据绑定使得 MVVM变得复杂和难用了,如果我们不能更好的驾驭两者之间的数据绑定,同样会造成Controller 代码过于复杂,代码逻辑不易维护的问题。
  • 一个轻量级的ViewController是基于MVCMVVM模式进行代码职责的分离而打造的。MVCMVVM有优点也有缺点,但缺点在他们所带来的好处面前时不值一提的。他们的低耦合性,封装性,可测试性,可维护性和多人协作便利大大提高了开法效率。
  • 同时,我们需要保持的是一个拥抱变化的心,以及理性分析的态度。在新技术的面前,不盲从,也不守旧,一切的决策都应该建立在认真分析的基础上,这样才能应对技术的变化。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值