理解面向协议,以及 面向协议简单应用

关于面向协议的介绍在百度上介绍的很多,也有比较不错的文章,这篇就很不错

先来看一下实现效果

实现效果图.png

首页控制器只有不到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只适用初学者高手请绕路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容