iOS关于MVC理解

1,260 阅读4分钟

- 前言

关于MVC很多人的用法和理解都不一样,其实不一定要说谁对谁错,重点是理解他们的思想,在实践用他们解决了什么问题,比如瘦身VC,UI和数据隔离,业务有较清晰的分层,解耦,可进行单元测试.

- 目录

  • 什么是MVC?
  • MVC作用?
  • 怎么使用MVC?

1.什么是MVC?

MVC 就是Model - View - Controller 模型 视图 控制器. 一种将应用中所有类组织起来的策略.

我们都知道iOS,系统提供的控制层有UIController为C层,UIController默认带一个view为V层,那么在最开始编写iOS代码,我们把网络请求,json数据转换,业务逻辑都写在Controller中,导致Controller非常的庞大,随着业务的增加,代码量增大,Controller可能就有几千行代码,维护起来异常的困难.
这个时候就出现了我们就想,把网络部分,数据逻辑处理从Controller中抽出来,单独为一层,就叫M层(猜想MVC由来)

2.MVC作用?

MVC软件架构模式是苹果推荐的开发模式
MVC出现让各个类的分层明确,各司其职,为Controller减负,降低耦合性,提高复用,可测试性.
各个层职责

  • M层专注负责数据处理及获取数据接口的实现
  1. 业务逻辑封装.
  2. 给V层提供调用接口
  3. 数据模型来存储数据
  4. 数据本地化
  • V层专注于页面渲染展示
  1. 界面搭建
  2. 展示数据
  3. 负责交互动画
  • C层专注负责协调V层M层.
  1. 组装View,生成view
  2. 响应view事件
  3. 调用Model接口,通知刷新view
  4. 处理view生命周期
  5. 负责页面跳转 MVC经典架构图如下图

image.png

上图就是V和M层是隔离的,有C层这个中间人来负责二者之间的通讯,这样可以保证V层和M层的复用性和测试,但是特殊情况下V层是可以持有Model层的.如果不考虑复用,这个View只展示Model里面对应的数据,那么就可以持有.
更通俗的解释就是C层创建UI,添加到对应的view上,然后调用Model层给的接口获取数据,当Model有数据了就通知C层,这里可以用Notification或者block来通知C层.C层响应后就立马更新view显示数据,当V层被点击了就回调给C层去处理对应的事件,这里回调给C层可以是delegate或者block.

怎么使用MVC?

首先很多人对Model层有一个误解就是Model就是只声明几个属性,然后一个创建方法.就是单纯的一个数据模型,然后就叫做Model层,其实这是不对的,这只能算Model 层的一部分,真的Model层是不仅需要数据模型,还需要做一些业务功能处理的.
那么定义Model层的代码,是不需要和V层和C层进行关联的,也就是Model层不需要依赖V层和C层的任何东西.整个MVC中最优的设计就是V层不依赖M层和C层,M层不依赖C层和V层,C层负责关联M层和V层.三者之间一定是单向依赖,不要产生双向依赖.
只有我们设计的层次都是单向依赖的时候,才更有利于我们后期的拆分,解耦,每层功能的替换.

实例

我们就使用MVC实现一个列表展示数据
1.分析列表展示,无非就是请求数据,然后展示给对应的列表,所以对应分工
M层负责网络请求数据然后通知给VC.
V层收到通知后,把数据给到V层.
V层负责展示渲染页面

image.png

我们在Model进行网络请求,然后使用了一个block进行回调通知,当然这里我们使用Notification或者delegate进行回调通知.因为我们这里是一个非常列表展示操作,所以Model只进行了网络请求操作,所以大家不要误解Model 只是进行网络请求,他可以做一些业务处理.这些业务尽量不要和V和C层关联,因为Model是一个单独存在的.有的同学可能又会有疑惑,那我的数据模型不就没有地方放了,数据模型我们在建一个类,然后做业务处理类和数据模型类就统称为M层.

image.png

image.png

image.png

在这里我们是在C层进行给View赋值的,当前如果我们这个View不准备复用,那么我们是可以把数据传入到View里面,然后在view赋值也是可以的,并不违背MVC. image.png