从MVP到MVVM
日期: 2019-06-01 分类: 个人收藏 364次阅读
前言
通过上篇文章,我们了解到利用mvp可以对mvc的c层瘦身,并使得层次分明,且网络请求变得通用。那就已经很完美了,那么mvvm是用来干嘛的呢。
对于mvvm它是用来描述数据和视图的关系的。我们开发过程中常常发现数据变化会导致视图的变化,如一个列表,当没有数据的时候要展示空界面,当有数据的时候要展示对应条数的列表界面。在比如当网络请求回来的列表中的一个为已点赞数据,那么界面的相应视图就要显示红心其他都为灰心。
以上示例都反应了数据和视图的这种绑定关系,并且数据一变化视图就要相应的进行变化,也就是所谓的数据驱动。
以上介绍在说明数据驱动视图这件事,这和mvc,mvp是不同的,导致了编码思想也不同。
数据一变化视图就要变化,也就是要监听数据的变化,这可以利用kvo。但是苹果中的kvo用起来很麻烦,首先要注册kvo,并在界面销毁时候要释放kvo。而RAC的出现解决了这个麻烦,从而使得mvvm的写法变得更方便了。也就是说mvvm要用到kvo思想来监听数据源的变化,从而让视图变化。rac代替了kvo的这种繁琐写法。mvvm用的是kvo思想,rac不是必须的,但是用了更方便而已。关于rac的用发可以参考这里
MVVM
M:Model,它是模型类,就是有很多属性,每个属性名字和后台返回的字段名相同。
V:View,它是视图类,如继承与UIView类的所有类都可以认为是V层,并且Controller也属于V层,即继承与UIView,UIViewController类的所有类都属于V层。这个类里存放的都是和视图相关的逻辑代码。并且controller类里存放的是一些胶水代码(就是起到粘合作用的代码)。和p层有区别,加入了视图和数据源的绑定机制。
VM:viewModel,它是vm层,这里是主要写网络请求,数据逻辑的地方。处理和视图无关的数据逻辑等。这个类不该持有v层,也就是不该#import <UIKit/UIKit.h>。并且该类和p层是有区别的,它不是通过回调的方式返回到v层。而是通过kvo的方式。
三者关系是,v层持有vm层,vm层持有m层,并通过kvo的方式通知v层。
通过以上分析,其实mvvm设计模式和mvp很像。只不过是把p层中的网络请求的回调去掉了,通过kvo的方式返回到v层。并把视图和vm层进行绑定,将p层进行这两个修改后重新起一个名字叫做vm层,也就变成了mvvm了。
下边我们用一些伪代码来进一步探索MVVM的应用,其实和MVP一样,我们也需要封装出一套MVVM的基类。用这些基类可以使得我们编码更方便。
/ 除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:测试 设计模式
精华推荐