谈到MVVM不得不先说一下MVC,MVC(Model-View-Controller)。网络
Model模型:用来呈现数据。测试
View视图:用来呈现用户界面。3d
Controller控制器:用来调节模型与视图之间的交互。对象
在 iOS 应用中日益增加的重量级视图控制器的问题。在典型的 MVC 应用里, 许多逻辑被放在 View Controller 里。blog
它们中的一些确实属于 View Controller,但更多的是所谓的“表示逻辑(presentation logic),为了避免让控制器日益增大,便于测试管理,便出现了MVVM。继承
MVVM:它实际上是一个 MVC 的加强版,并将表示逻辑从 Controller 移出放到一个新的对象里,即 View Model。内存
在 iOS 上使用 MVVM 的动机,就是让它能减小 View Controller 的复杂性并使得表示逻辑更易于测试。同步
ViewModel: 它位于 View/Controller 与 Model 之间。io
代码示例:class
一、首先是model层的代码,基于JSONModel封装了BaseModel类(基类:之后的Model均可继承此类),继承自BaseModel,实现HomeModel类。
二、而后是View层的代码,View层控件所有用懒加载方式,尽量减小内存消耗,不喜欢用XIB,因此习惯纯代码编写。
三、接下来看ViewModel层,对封装好的NetWork进行处理,request网络数据存储在HomeModel里,最后将数据用Block带出去,方便在VC中使用数据,reloadData。
四、最终,HomeViewController 将会变得很是轻量级:
怎么样?其实 MVVM 并无想像中的那么难吧,并且更重要的是它也没有破坏 MVC 的现有结构,只不过是移动了一些代码,仅此而已。总结下 MVVM 相比 MVC 到底有哪些好处呢?
一、因为展现逻辑被抽取到了 viewModel 中,因此 view 中的代码将会变得很是轻量级;
二、因为 viewModel 中的代码是与 UI 无关的,因此它具备良好的可测试性;
三、对于一个封装了大量业务逻辑的 model 来讲,改变它可能会比较困难,而且存在必定的风险。在这种场景下,viewModel 能够做为 model 的适配器使用,从而避免对 model 进行较大的改动。
经过前面的示例,咱们对第一点已经有了必定的感触,至于第三点,可能对于一个复杂的大型应用来讲,才会比较明显。
综上所述,咱们只要将 MVC 中的 controller 中的展现逻辑抽取出来,放置到 viewModel 中,而后经过必定的技术手段,来同步 view 和 viewModel ,就完成了 MVC 到 MVVM 的转变。