iOS中MVC设计模式

一、什么是MVC

单例、通知等是我们在项目中经常用到设计代码的一种方式,MVC和他们一样也是一种用来设计代码的模式,他就像一个模板,一个框架,我们这个以这个框架为模子,创造我们的代码。

二、MVC的分工

M(Model)

1、给ViewController存储数据、处理数据、提供数据

  • 一般的我们在Model会有很多属性,这些属性就是用来保存数据的;

  • 我们在Controller里面拿到这些属性就可以给View赋值,这就是Model给Controller提供数据,Controller将数据给View;

  • 有时候Model中存储数据的时候需要对数据进行处理,比如数据需要转换成字符串存在属性里等,这都是在Model中做完,然后存储起来,这就是处理数据。

2、给ViewController提供接口

  • 有很多小伙伴将Api接口直接写在Controller里面,拿到服务器请求到的数据后直接在Controller里面处理,处理完直接用,这样可以实现功能,但是请求多了、项目大了导致Controller里面各种代码,各种逻辑,慢慢就难以维护了。这样做其实是将Model的工作交给了Controller,Model的职能没有被做大的化的使用。

  • 其实我们可以将Api写在Model里面,Model请求到服务器数据的时候在Model做完数据处理,然后直接返回给Controller,Controller拿到Model处理好的数据直接做其他刷新UI的操作这不是很有章法的吗,而且逻辑紧凑,分工明确。

3、提供经过抽象业务基本组件,供Controller调度

  • 举个很简单的例子,大家项目里有没有用摄像头,或者定位等功能,我们把这些功能进行二次封装,封装成我们项目所需要的,更能给项目提供更加便捷的类。这些类我们大多数人把它叫做Manager,定位管理类,系统相册管理类...这些继承于NSObject的类被你改了个名字你就不知道它属于Model的吗?他们其实是一回事,都是Model,有些人可能会说照你这样说只要是继承NSObjct的类都是Model,我可以确切的告诉你:是的,没毛病。

V(View)

1、构成UI

  • 注意点就不用说了,View上面有各种UI界面的东西。

2、响应UI事件

  • 这里注意了,相应UI事件不是说相应事件的处理就在View中做,如果你这样做你可以试试看;

  • View的事件通过代理的形式告知Controller,Controller实现协议执行事件的代理,这时候在代理里面处理业务操作;

  • 强调一点就是关于一些UI的动画,如果合适的话尽量放在View里面去做;

3、展示UI

  • 也不用说,UI需要填充数据,展示UI。

C(Controller)

1、管理ViewController的生命周期

  • Controller的周期函数

2、负责初始化所有UI的实例,并将其添加到self.view上

  • 在Controller中将创建View并添加在self.view上,使得UI展示出来。

3、通过监听、代理等方式处理来自View与业务先关的事件,实现相关业务

  • 在Controller实现View的代理或者监听,当View层有事件发生的时候就会委托Controller实现代理方法,在代理方法中处理好相关的业务。

4、通过与Model的交互,获取Model的数据,将数据给View

  • Controller中通过Model发起网络请求,然后Model将网络请求来的数据处理好后返回给Controller,Controller在将这些数据给View,实现给View界面赋值或者刷新View数据。

三、 MVC的本质

1、Model就是一个继承自NSObject的类;

  • 在MVC设计模式中,大多数人将Model看做是Controller的Model,其实它不仅仅可以作为Controller的Model,它也可以看做是view的Model,哪个view呢,就是Controller自带的self.view。在MVVM中View有自己的Model,在这里是同理。当然你可以在项目中将Controller的Model和View的Model分开,各自管理各自的Model,View的Model为View提供数据,Controller的Model为Controller提供api接口,视项目情况定,不深入学习和体会对view的Model和Controller的Model界限会很模糊。

2、View就不用说了;

3、重点来说一下Controller
Controller的组成:Controller大家都知道它是容器,那它为什么可以作为容器?

  • 首先来看Controller的组成,从新建的Controller里面我们可以看出来Controller是由周期函数、一个View,即self.view组成,或者还有其他的,就不说了不是重点。

  • 也就是说Controller上面是有一个View的,那为什么需要这个View呢,因为我们将创建的UI实例都放在这个View上,才能将UI展示出来。

  • 这样一来就透彻了,Controller上有个View,我们将UI是放在这个View上才能展示出来的,Controller里面装了一些UI,与其说是Controller装了些UI还不如说,因为Controller上面有一个View,这个View里面装了一些UI的实例,所以才能展示出来UI层。

  • 所以说View才是个容器,Controller如果没有自带的这个View它就不能被称作是容器。
    所以说在iOS里面UIView不光可以用作是展示UI的对象,还可以作为容器的一个对象。

四、示例

这里有一个ViewController,ViewController里面有一个View,_userInfoView用来展示用户信息。ViewController中还有一个UserInfoModel用来存储和管理用户信息。

@interface ViewController ()
{
    UserInfoView *_userInfoView;
}

/**
 ViewController的Model
 */
@property (nonatomic, strong) UserInfoModel *infoModel;

@end

ViewController中周期函数:

#pragma mark cycle
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //UI
    [self setUpUI];
    //request
    [self requestUserInfo];
}

这里没写其他周期函数,看项目需要自行添加。在viewDidLoad里面一个方法是初始化UI,另一个方法请求服务端数据。
infoModel通过懒加载用的时候在创建。
在请求数据的方法中需要做很多处理和操作:

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

推荐阅读更多精彩内容