MVC
是iOS开发中一种很基础的工程架构模式,也是构建iOS应用的标准模式。它将数据模型
、UI视图
和逻辑控制器
分开并规定它们之间的通信方式,大大优化了程序的结构组织。
M表示
Model
,专门用来存储对象数据的模型
,一般使用一个继承NSObject的基本类对模型的数据进行封装,在.h文件中声明一些用来存放数据的属性。在CoreData
中模型即Managed Object
。
V表示
View
的可见元素,展示UI界面给用户,主要为UIKit
中UIView
的子类,其中和用户进行交互的视图元素为UIKit
子类UIControl
下的子类视图,非UIControl子类
的视图不能交互。
C表示
Controller
,逻辑控制器,对应于UIKit
中UIViewController
及其子类控制器,负责协调View
和Model
。
Controller
和View
的通信主要通过一些代理协议
以及block代码块
等实现;而Controller``和Model
的通信主要用到Notification消息通知
和KVO
等典型观察者模式
实现;View
和Model
是隔离的,不可以直接相互通信。
MVC设计模式
是官方推荐在iOS开发中使用的规范模式,应用的数据存储在Model
层,逻辑处理在Controller
中进行,而用户界面在View
中展示。
如何理解MVC设计模式?
MVC
全名是Model View Controller
,是模型(Model)
—界面视图(View)
—控制器(Controller)
的缩写,它是一种软件设计规范,用一种将业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到Controller
中,在改进和个性化定制界面及用户交互的同时,不需要编写业务逻辑。可以用图1来描述通过控制器实现的视图到模型的交互过程。
1.模型对象
模型对象封装了应用程序的数据,并
定义了操控和处理该数据
的逻辑
和运算规则
。用户在视图层
中所进行的创建或者修改数据的操作,会通过控制器对象传达出去,最终会创建或更新模型对象。另外,当模型对象更改时(例如,通过网络连接接收到新数据),模型对象会通知控制器对象,控制器对象更新相应的视图对象。被模型返回的数据是中立的,也就是说模型和数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需要写一次就可以被多个视图重用,所以减少了代码的重复性
。
2.视图对象
视图对象是应用程序中用户可以看到并且能够与之交互的界面。视图对象对外提供
显示自身和响应用户操作的接口
。视图对象的主要作用就是显示来自应用程序模型对象的数据
,并使该数据可被编辑
。在iOS应用程序开发中,所有的控件、窗口等都继承自UIView
,对应于MVC
中的View
。
3.控制器对象
在应用程序的
一个或多个视图对象
和一个或多个模型对象
之间,控制器对象充当媒介
。因此,控制器对象是同步管理程序,通过控制器对象,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它。
MVC设计模式的
低耦合性
、高重用性
、可维护性
等优点显而易见,使得原本复杂的代码与界面的交互变得简单、清晰、明了,开发者可以把更多的精力放在前端界面的设计上,而不用绞尽脑汁去思考究竟应该如何使界面得到同步,这样减轻了设计压力,也从另一方面使用户得到更多更好的享受体验。事实上,MVC设计模式也是苹果公司推荐并在大量实践的设计模式。例如,对于不同的UIView
类型的视图对象,都有相应地控制器对象(即UIViewController
)与之对应。例如,常用的视图类UITableView
,它所对应的控制器对象就是UITableViewController
类对象。
MVC设计模式有哪些优缺点?
- MVC的优点如下:
1.代码具有低耦合的特性
耦合性
,也称块间联系
,指程序结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性越差。在MVC设计模式中,由于视图层
、业务层
和数据层
的分离,每个模块之间相互独立,这样就允许更改视图层代码而不用重新编译模型和控制器代码。同样,一个应用程序的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型
与控制器
和视图
相分离,所以很容易改变应用程序的数据层和业务规则。
2.高重用性和可适用性
随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC设计模式允许用户使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何
Web(HTTP)浏览器
或者无线浏览器(WAP)
。例如,用户可以通过计算机也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML
来表示,也有可能用WAP
来表示,这些表示所需要的命令是改变视图层的实现方式,而控制层
和模型层
无须做任何改变。
3.较低的生命周期成本和高可维护性
MVC设计模式
使视图层
和业务逻辑层
分离,使得应用更易于维护和修改,开发和维护用户接口的技术含量降低,技术人员只要关心指定模块的代码逻辑即可。
4.有利于软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
- MVC的缺点如下:
1.增加了系统结构和实现的复杂性
MVC设计模式
适合用户界面和业务逻辑比较复杂的应用程序。对于简单的界面,严格遵循MVC设计模式,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2.视图与控制器间的过于紧密的连接
虽然视图与控制器之间是相互分离的,但在实际开发中,
视图
与控制器
确又是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了它们的独立重用。
3.视图对模型数据的低效率访问
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
4.控制器臃肿
大量逻辑处理代码全部放入
ViewController控制器
中,加上要遵循很多协议
,会导致其变得臃肿和混乱,难以维护和管理,也难以分离模块进行测试。
5.缺少专门放网络逻辑代码的部分
导致网络逻辑处理只能放在
Controller控制器
中,加剧了Controller控制器
部分的臃肿问题。