MVVM架构的一次实践,重写iOS头条客户端
2016-05-12 09:29
381 查看
前言:
一个iOS头条APP,使用MVVM架构实现,代码中有注释,封装了AFN网络请求,解媾代码,使用起来非常方便。用最经典的TableView展示,后续不断更新,喜欢就star或fork一下,有问题或者建议意见就issues!
本例基于AFN封装了网络请求系列库,以满足自己需求,后期易于扩展;使用JSONModel解析json数据;每个VC都有自己的ViewModel类用来处理网络请求和其他逻辑处理;使用经典的UITableView展示MVVM架构,适合初学MVVM的coder参考。
简介:
![](http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLJKAwPiaaSDFZSbpShcmibJDStcicPWYyEBic6JhqeibTDPaFGzSHC1xJicpyeITb1LLQD72uEUlXfV0I8Q/0?wx_fmt=jpeg)
MVVM的出现主要是为了解决在开发过程中Controller越来越庞大的问题,变得难以维护,所以MVVM把数据加工的任务从Controller中解放了出来,使得Controller只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。
MVVM是基于胖Model的架构思路建立的,然后在胖Model中拆出两部分:Model和ViewModel。ViewModel本质上算是Model层(因为是胖Model里面分出来的一部分),所以View并不适合直接持有ViewModel,因为ViewModel有可能并不是只服务于特定的一个View,使用更加松散的绑定关系能够降低ViewModel和View之间的耦合度。
在一个典型的 MVC 应用中,controller 由于承载了过多的逻辑,往往会变得臃肿不堪,所以 MVC 也经常被人调侃成 Massive View Controller。(Massive译:大量的、巨大的、臃肿不堪的)
因此,一种可以很好地解决 Massive View Controller 问题的办法就是将 controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel 。其实,我们只要在上图中的 M-VC 之间放入 VM ,就可以得到 MVVM 模式的结构图:
源码解析:
1、首先是model层的代码,基于JSONModel封装了BaseModel类(基类: 以后的Model都可继承此类),继承自BaseModel,实现HomeModel类。
![](http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLJKAwPiaaSDFZSbpShcmibJDSKGaGPeQa4Qtle8vynlFnLf8xPUpzge6aqBEicyxvKHYDIOd5WRQLcfw/0?wx_fmt=png)
2、然后是View层的代码,View层控件全部用懒加载方式,尽可能减少内存消耗;不喜欢用XIB,所以习惯纯代码编写。
![](http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLJKAwPiaaSDFZSbpShcmibJDSy60WB9Lq7TibIoFBnBTibA3vRyQ6xqYryy0J1gthPHLjPKsqwo9XNwmg/0?wx_fmt=png)
3、接下来看ViewModel层,对封装好的NetWork进行处理,request网络数据存储在HomeModel里,最后将数据用Block带出去,方便在VC中使用数据,reloadData。
![](http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLJKAwPiaaSDFZSbpShcmibJDSrQ2ByrXia9r5xk7rBe9AST3b8PicicIs5Kyia8Ah5icrF9ianlHybTCb9TTQ/0?wx_fmt=png)
4、最终,HomeViewController 将会变得非常轻量级:
![](http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLJKAwPiaaSDFZSbpShcmibJDSyIiaozJAthEEOXCncnPepB7U7sM5icIkxNDhQu5VESWibGN9fszeqGsWw/0?wx_fmt=png)
MVVM并没有想像中的那么难,而且更重要的是它也没有破坏 MVC 的现有结构,只不过是移动了一些代码,仅此而已。总结下 MVVM 相比 MVC 到底有哪些好处呢?
我想,主要可以归纳为以下三点:
1、由于展示逻辑被抽取到了 viewModel 中,所以 view 中的代码将会变得非常轻量级;
2、由于 viewModel 中的代码是与 UI 无关的,所以它具有良好的可测试性;
3、对于一个封装了大量业务逻辑的 model 来说,改变它可能会比较困难,并且存在一定的风险。在这种场景下,viewModel 可以作为 model 的适配器使用,从而避免对 model 进行较大的改动。
通过前面的示例,我们对第一点已经有了一定的感触;至于第三点,可能对于一个复杂的大型应用来说,才会比较明显。
小结:
综上所述,我们只要将 MVC 中的 controller 中的展示逻辑抽取出来,放置到 viewModel 中,然后通过一定的技术手段,来同步 view 和 viewModel ,就完成了 MVC 到 MVVM 的转变。
效果图
一个iOS头条APP,使用MVVM架构实现,代码中有注释,封装了AFN网络请求,解媾代码,使用起来非常方便。用最经典的TableView展示,后续不断更新,喜欢就star或fork一下,有问题或者建议意见就issues!
本例基于AFN封装了网络请求系列库,以满足自己需求,后期易于扩展;使用JSONModel解析json数据;每个VC都有自己的ViewModel类用来处理网络请求和其他逻辑处理;使用经典的UITableView展示MVVM架构,适合初学MVVM的coder参考。
简介:
MVVM的出现主要是为了解决在开发过程中Controller越来越庞大的问题,变得难以维护,所以MVVM把数据加工的任务从Controller中解放了出来,使得Controller只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。
MVVM是基于胖Model的架构思路建立的,然后在胖Model中拆出两部分:Model和ViewModel。ViewModel本质上算是Model层(因为是胖Model里面分出来的一部分),所以View并不适合直接持有ViewModel,因为ViewModel有可能并不是只服务于特定的一个View,使用更加松散的绑定关系能够降低ViewModel和View之间的耦合度。
在一个典型的 MVC 应用中,controller 由于承载了过多的逻辑,往往会变得臃肿不堪,所以 MVC 也经常被人调侃成 Massive View Controller。(Massive译:大量的、巨大的、臃肿不堪的)
因此,一种可以很好地解决 Massive View Controller 问题的办法就是将 controller 中的展示逻辑抽取出来,放置到一个专门的地方,而这个地方就是 viewModel 。其实,我们只要在上图中的 M-VC 之间放入 VM ,就可以得到 MVVM 模式的结构图:
源码解析:
1、首先是model层的代码,基于JSONModel封装了BaseModel类(基类: 以后的Model都可继承此类),继承自BaseModel,实现HomeModel类。
2、然后是View层的代码,View层控件全部用懒加载方式,尽可能减少内存消耗;不喜欢用XIB,所以习惯纯代码编写。
3、接下来看ViewModel层,对封装好的NetWork进行处理,request网络数据存储在HomeModel里,最后将数据用Block带出去,方便在VC中使用数据,reloadData。
4、最终,HomeViewController 将会变得非常轻量级:
MVVM并没有想像中的那么难,而且更重要的是它也没有破坏 MVC 的现有结构,只不过是移动了一些代码,仅此而已。总结下 MVVM 相比 MVC 到底有哪些好处呢?
我想,主要可以归纳为以下三点:
1、由于展示逻辑被抽取到了 viewModel 中,所以 view 中的代码将会变得非常轻量级;
2、由于 viewModel 中的代码是与 UI 无关的,所以它具有良好的可测试性;
3、对于一个封装了大量业务逻辑的 model 来说,改变它可能会比较困难,并且存在一定的风险。在这种场景下,viewModel 可以作为 model 的适配器使用,从而避免对 model 进行较大的改动。
通过前面的示例,我们对第一点已经有了一定的感触;至于第三点,可能对于一个复杂的大型应用来说,才会比较明显。
小结:
综上所述,我们只要将 MVC 中的 controller 中的展示逻辑抽取出来,放置到 viewModel 中,然后通过一定的技术手段,来同步 view 和 viewModel ,就完成了 MVC 到 MVVM 的转变。
效果图
相关文章推荐
- zmNgFrameWork 架构升级ng1.5和md5静态资源缓存方案【angular1.x】
- 每秒处理10万订单乐视集团支付架构
- 使用bootstrap3开发响应式网站
- Provisioning Services 7.8 入门系列教程之十二 实现高可用性
- 大型网站系统架构演化之路
- 关于“幽灵架构”的补充说明3:为什么不会产生“循环引用”
- Android之系统架构
- 大型网站技术架构(2):架构要素和高性能架构
- keepalived实现LVS集群的高可用(1)
- 面向Web三层架构对面向对象的理解
- 空气测试仪“清心”(2)-整体架构
- Android控件架构与自定义控件详解(一)——Android控件架构与View的绘制原理
- 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构
- 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构
- 采集反爬虫网站,采集不到内容!
- ros学习网站
- 追查网站的思路
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))
- C#学习网站
- MySQL5.7 利用keepalived来实现mysql双主高可用方案的详细过程