关于面向协议的介绍在百度上介绍的很多,也有比较不错的文章,这篇就很不错
先来看一下实现效果
首页控制器只有不到80行代码就将效果实现了,是不是对控制器代码的复杂程度大大减少了不少呢。此demo中用的的所有东西皆由268教育集团提供,首页也是模仿《268新课题》软件首页实现的,大家可以在App Store搜索一下,一款很不错的软件。如果有违反268的规定我会立即删除文章和demo,demo内容严禁私自盗用。
因为网上关于这方面的demo很少,大部分是理论,也不适合初学者,我根据自己的理解写了个简单的demo,写的很渣,高手请绕路。点击下载demo
关于MVC理解:
第一次听MVC概念还是面试的时候,面试官问我写项目的时候一般用什么模式写的,excuse?刚培训出来不懂啊胡乱说一通,后来在网上简单查了一下MVC到底是啥也没有深入的去了解它到底该怎么用,如何划分层次.现在做开发已经有一段时间了,对MVC的概念以及用法已经有了一定的理解.
MVC模型-视图-控制器(Model-View-Controller)
模型(Model)
一般模型对象里面放的是数据请求的属性,一般我们是这么写的,而.m里面则什么都没有.如果你没有用Masonry或SDAutolayout来自动布局的话可能还需要计算一下视图布局,view中的控件的fream来不是在view中来计算的而是在model中就已经计算好了,对于这部分希望你看一下这个demo下载demo.这个里面利用是YYKit框架去实现计算字符的宽高的,有兴趣的可以自己写一个NSMuttableAttstring属性扩展,也可以达到相同的目的
View
一般都都是一些子类化界面,比如自定义cell的视图,tableView的headView等等,这里没什么好说的
控制器Control
用来控制一个或多个视图对象和一个或多个模型对象之间关系,控制器对象因此是同步管道程序,通过它,视图对象了解模型对象的更改,控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期
控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它.M和V永远不能相互通信,只能通过控制器传递。控制器可以直接与Model对话(读写调用Model),控制器可以直接与View对话,通过接口,直接操作View,接口直接对应到View中的控件,View通过action向控制器报告事件的发生(如用户的点击事件)。控制器是View的直接数据源(数据很可能是控制器从Model中取得并经过加工了)。控制器是View的代理(delegate),以同步View与Controller。
层次分完了,很完美,但是网络请求放哪里?你可能试着把它放在Model对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的Model生命周期更长,事情将变的复杂(这段话是网上说的,具体会出啥结果我还没有得到验证,我一般都是把网络请求放入model中).显然也不应该把网络代码放在view里,因此只剩下控制器了,因为这加剧了厚重控制器的问题。
基于MVC理解使用MVVM
Model-View-ViewModel 在MVVM里,view和viewcontroller正式联系在一起,我们把它们视为一个组件。视图view仍然不能直接引用模型Model,当然controller也不能。相反,他们引用视图模型view Model。view Model是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方,由于展示逻辑(presentation logic)放在了view Model中(比如Model的值映射到一个格式化的字符串),视图控制器本身就会不再臃肿。当你开始使用MVVM的最好方式是,可以先将一小部分逻辑放入视图模型,然后当你逐渐习惯于使用这个范式的时候再迁移更多的逻辑到视图模型中.以我写项目的经验,使用MVVM会轻微的增加代码量,但总体上减少了代码的复杂性。
基于面向协议MVP的介绍
MVP到底是什么? M : 逻辑Model层 V : 视图层 P : protocol协议层 其实MVVM已经把层次分的很清楚了,VM将逻辑层和网络层给分离出来,那为什么又多出来个协议层呢? 视图显示大部分是基于协议去实现的,比如tableviewdelegate和tabledatasource协议,如果有两个页面有tableview都需要将协议实现一遍,不感觉有点重复造轮子了吗?如果将协议抽离出来封装成对象去实现,那只需要写一个就可以了啊,理想情况下是这样的,可是项目中每个页面也总不能都长一样吧,这也只能应用于简单的项目,有相似度的页面,我在网上查资料的时候,有人把事件操作(比如点击事件)也封装到了Model中,我认为这是不是很好,控件肯定都是在view层,如果实现事件响应也是通过view层去block或代理去实现,如果把事件封装给Model,再通过Model与控制器交互进行事件响应,感觉比较繁琐而且代码也不易理解,这个看个人理解吧。因为MVP概念是刚刚了解,用的地方不是很多,就简单写了个demo将协议从控制器中分离出来感觉很实用。demo是用swift写的,本来是用OC,写OC那个demo东西比较乱比较杂,正好自己在学swift所以就用swift去实现了一下。具体实现是在Home
文件夹下。demo中有用到代理,block,扩展等方法,很适合初学者来了解swift。
总的来说这篇写的还是比较水的,刚开始介绍MVC模式来引申出来MVVM再到MVP后来写着写着把自己绕进去了,总的来说MVP就是将协议层抽离出来,比较适用于tableView视图和CollectionView视图,将协议抽出来很大程度的减少了Control的代码量,使Control变得非常清晰,控制器只实现代理事件和数据刷新加载,因为demo中没有做数据的刷新,数据请求也是放到Model中去请求的,数据上拉加载更多的数据应该是放在Control去实现的,我想这也比较合理的。学习MVP也没有几天所以用的不好,有的东西也分的不是很清楚,此demo只适用初学者高手请绕路。