iOS架构师?So easy!

序言

年年岁岁花相似,岁岁年年人不同。

很久很久以前……

MVC模式以低耦合性、高重用性、可维护性等优点,使得原本复杂的代码与界面的交互变得简单、清晰、明了。开发者可以把更多的精力放在前端界面的设计上,而不用绞尽脑汁去思考究竟应该如何使界面得到同步。既减轻了设计压力,又能极大提高用户体验感。

接下来小编来浅谈一下这些架构模式,同时小编也欢迎大家加入小编的iOS交流群551346706,群里会提供架构的资料,书籍欢迎大家入驻!

然而随着时间的推移以及技术的发展,传统的MVC模式已经不适合当下的iOS开发了。先让我们来复习一下iOS中的MVC模式吧!

MVC架构模式

在 iOS 开发中,MVC(Model View Controller)是构建iOS App的标准模式。在MVC下,所有的对象被归类为一个Model,一个View,和一个Controller。Model持有数据,View显示与用户交互的界面,而ViewController调解Model和View之间的交互。

现在,MVC 依然是目前主流客户端编程框架。然而,在MVC模式中,厚重的Controller、无以立足的网络逻辑和较差的可测试性已经成为该模式无可避免的问题了

厚重的Controller

由于大量的代码被放进view controller,导致他们变的相当臃肿。网络数据的请求及后续处理,本地数据库操作,以及一些带有工具性质辅助方法都加大了MassiveViewController的产生。

遗失的网络逻辑

苹果使用的MVC的定义上说,所有的对象都可以被归类为一个model,一个view或是一个controller。那么要把网络的代码放在哪里呢?

显然,不应该把网络请求放在view中。若把它放在model对象里,网络调用应该使用异步,可是这样的话如果一个网络请求比它持有的model生命周期更长,事情就会变得复杂。若是放在contoller里面,也会加剧厚重controller的问题。

较差的可测试性

由于View Controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。

为了避免和解决上述问题的产生,于是就从MVC引申出来一种维护性较强、耦合性低的新的架构MVVM(Model View View-Mode),MVVM正式规范了视图和控制器紧耦合的性质,并引入新的组件。MVVM主要目的是为了分离视图(View)和模型(Model)。

MVVM模式

MVVM是Model-View-ViewModel 的简写,最早于2005年被微软的WPF 和 Silverlight的架构师John Gossman提出。

Model:和MVC中的model保持一致,用于处理数据逻辑

View:由 MVC 中的view和 controller 组成,负责 UI 的展示,绑定 viewModel中的属性,触发 viewModel 中的命令以及呈现由viewModel提供的数据。

View-Model:它的职责之一就是作为一个表现视图显示自身所需数据的静态模型,它是从 MVC 的 controller 中抽取出来的展示逻辑,负责从 model中获取 view 所需的数据,转换成 view可以展示的数据,并暴露公开的属性和命令供 view 进行绑定。

在MVVM实现中,利用 RAC来优雅的实现view 和 viewModel 两者之间的数据绑定(同步)。

MVVM优点

1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。

4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

MVP模式

MVP是由 MVC演变而来的,它的Presenter根本不用关心ViewController的生命周期,所以在 Presenter里面几乎没有涉及到 UI 的代码,我们所有的 UI 处理全部放到了UIViewController里面,这样的话很符合设计模式中的单一职责。

在MVP中,View和Model之间是不存在引用和依赖的。

下面分享一个MVP架构模式的简单案例

新建下面的类

在MVPContoller中对三个角色进行关联。

创建属性

controller类需要关联三个角色,因此需要在该类中创建三个角色的属性。

对三个角色进行初始化设置

分别创建三个角色,MVPView要添加到Controller上显示。这个案例就是为了将Model的内容显示到view中。所以这里提前给model设置好内容。调用presenter的printTask方法将两者关联起来。

model中存储需要的数据,定义内容属性

此处跟mvc不同之处就是给view传递的是一个字符串而不是一个model。因为view与model在mvp架构是无关联的。

在MVPView.h中创建展示view的方法体

在MVPView.m文件中添加按钮

初始化按钮,让model的内容显示在label上。

presenter.h创建一个方法

这个是业务逻辑的入口。

在MVP模式中,所有的耦合都存在与Presenter之中,所以Presenter需要有View和Model的存在。

将两者通过Presenter联系起来

Prensenter的作用就是调用view并把model的内容传递给它。

 到程序入口处调用MVPController

如此一来,一个简单的MVP案例搭建完毕。

面试题

1、在MVC模式中,如何解决controller层的臃肿问题?

将网络请求抽象到单独的类中

将界面的拼装抽象到专门的类中

构造 ViewModel 

这样抽象之后,View 只接受 ViewModel,而 Controller 只需要传递 ViewModel 这么一行代码。而另外构造 ViewModel 的过程,我们就可以移动到另外的类中了

专门构造存储类

2、MVC 和 MVVM 的区别

MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中处理

MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进。

参考链接:

https://juejin.im/post/59de301cf265da4310475f2c

https://www.jianshu.com/p/db8400e1d40e

https://www.jianshu.com/p/79591e226d8c

最后

小编在这也推荐一下自己QQ群:551346706,学习氛围还行,共同学习探讨,三人行必有我师,一起为自己更好的2018加油

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

推荐阅读更多精彩内容