MVC模式是iOS编程中提到的最多次的设计模式,也是使用最频繁的设计模式之一。网络上有很多的MVC模式的分析文章,但都是从原理上来解释,很少能找到配套的案例来说明到底在实际的项目中要如何的使用这种模式。小编在经过详细的研究、对比和实验了之后,总结了一下这个模式的一些简单使用方法,希望能起一个抛砖引玉的作用,使得对MVC默认的同学能依葫芦画瓢的了解MVC模式的使用方法,并以此类推出更多、更好的方法出来。
这篇文章先从老生常谈的MVC设计模式的原理说起,然后配上一个简单的案例,以演示如何将一个常规的编程改为使用MVC模式来编程。
本文假定,您已经熟悉了target-action模式、delegate模式、Notification或KVO模式。如果这几个模式还不是很了解,可参考网络上其它文章说明,本文不会就这些模式做详细讲解。
一、什么是MVC?
MVC是model-view-control的简称。在解释这个名词之前,我们先假定一个案例,在这个例子中,有两个文本框T1和T2、两个按钮B1和B2,B1为保存按钮,B2为加载按钮;T1为文本内容编辑按钮,当点击B1时,将T1里面的内容保存到数据库中;当点击B2时,将数据库中保存的内容显示到T2上。为了验证这个操作是否是经过数据库了,我们可以做一个操作,比如将T1里面的内容后面加上一些字符、符号等(这个相信很好做吧,你可以在将T1的数据保存到数据库的时候做这个操作,也可以在将数据从数据库中调出、显示在T2上之前做这个操作,本案例不在详细叙述)。当我们脑海里形成好了这样一个应用之后,下面我们来看看M、V、C到底做什么样的工作:
View——顾名思义,就是存放视图使用的。对应上面的例子,我们应该把T1、T2、B1和B2放在View上,对吧?
Model——即模型。模型一般都有很好的可复用性,统一管理一些数据。在上面的例子中,数据库是不是可以作为一个模型呢?答案是肯定的。所以,我们就把数据库的所有操作都放在Model里面执行——包括但不限于数据库的创建、插入、查询、更新和删除(为啥都放一起?地球人都知道。。。)
Controller——控制器,充当一个CPU的功能,即该应用程序所有的工作都由Controller统一调控。它负责处理View和Model的事件。具体怎么调控和处理?在下面的MVC原理里面,我们将详细讲解。
MVC模式能够完成各司其职的任务模式,由于降低了各个环节的耦合性,大大优化Controller的代码量,当程序调试时,如果某一个功能没有按照既定的模式工作,可以很方便的定位到到底是Controller还是View还是Model出了问题,而且还利于程序的可复用性,建议在程序中能多多使用这个模式。
二、MVC的原理
上面的内容中,已经详细描述了model、view和controller之间如何各司其职(即该是谁的东西,谁就要保护好,不能让另外一个越俎代庖的去处理)。MVC模式虽然是iOS编程中使用最广泛的模式,但论起复杂程度,MVC模式可以算是众多设计模式之首。通常情况下,MVC模式需要综合使用target-action模式、delegate模式、Notification或KVO模式等。下图是斯坦福大学的iOS一堂关于iOS介绍的公开课上所使用的示例图,这张图像也生动的描绘出来了MVC模式的工作原理,接下来的原理讲解也是依托于这张图像:
1、 Controller和View之间可以通信,Controllor通过outlet(输出口)控制View,View可以通过target-action、delegate或者data source(想想UITableVeiwDatasource)来和Controller通信;
2、 Controller在接收到View传过来的交互事件(View就是完成让人和程序的交互的呀,比如按B1按钮)之后,经过一些判断和处理,把需要Model处理的事件递交给Model处理(比如刚才的例子中的保存到数据库),Controller对Model使用的是API;
3、 Model在处理完数据之后,如果有需要,会通过Notification或者KVO的方式告知Controller,事件已经处理完,Controller再经过判断和处理之后,考虑下一步要怎么办(是默默无闻的在后台操作,还是需要更新View,这得看Controller的“脸色”行事)。这里的无线天线很有意思,Model只负责发送通知,具体谁接收这个通知并处理它,Model并不关心,这一点非常重要,是理解Notification模式的关键。
4、 Model和View之间不直接通信!
按照上面的原理,我们知道了M、V、C之间的各司其职——Model不保存控件,View不做数据库操作(但这个也不是绝对,如果需要View做一些数据缓存工作,还是需要保存一些临时数据的),而Controller就充当了两者之间的协调器。
如此,MVC的原理已经理出来一个头绪了,那么我们来看一个实际的例子,来验证如何使用MVC模式。在这个例子中,View通过target-action模式向Controller传递消息,Controller通过API调用Model里面的方法来处理从View那接收到的消息