MVC模式
mvc是前两年使用较为宽泛的设计模式,甚至宽泛到又一次我面试说熟悉它,面试官竟说它也算设计模式,在此我想回敬一句,是不是所有人都用苹果手机,iOS就不叫操作系统了呢???哈哈😄,言归真转
MVC即字面意思为model、view、controller,其用意在于将数据与视图分离开来,
model:模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。
view:视图对象是应用程序中用户可以看见的对象。视图对象知道如何将自己绘制出来,可能对用户的操作作出响应。视图对象的主要目的就是显示来自应用程序模型对象的数据,并使该数据可被编辑
controller:在应用程序的一个或多个视图对象和一个或多个模型对象之间,控制器对象充当媒介。控制器对象因此是同步管道程序,通过它,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期
m、v、c之间的关系
如图一所示:
model与view之间不可通信,
View 与 Controller 的关系是十分紧密的,他们之间可以双向通信。
Controller 可以直接操作 View。在使用 Storyboard 进行界面设计时,我们可以直接拖拽现有的控件(View),再通过 Controller—Drag 就可以为各种 控件生成一种类似于句柄的 outlet来作为 ViewController 的属性,ViewController 通过 outlet 来对 View 进行操作,设置其外观、状态或者行为等等。如果是通过纯代码来编写界面,ViewController 类中就包含了控件的实例,直接通过这些实例的指针进行操作即可。
View 可以通过特殊的方式来发消息给 Controller。因为系统自定义的 View 并不知道当用户进行操作之后,Controller 需要做些什么,为了减少耦合性,采用了一些特殊的方式来与 Controller 进行通信。通信的方式有:
IBAction。通过 Controller—Drag,XCode 会自动生成事件的响应方法。也可以使用 (void)addTarget:(id)target action:(SEL)action 方法来注册事件的响应方法。
DataSource。当系统的某些 View 在呈现时需要我们提供相应的数据。我们必须为 View 指定 DataSource,并实现相应的 DataSourceProtocol(所谓的 Protocol 是指预先定义好的一组回调函数,其中的部分是必须实现的,部分是可选的。)最典型的是 UITableView,我们必须告诉系统这个 TableView 有多少行,每行的 Cell 内容是什么。
Delegate。它也是一组 Protocol,系统会在特定事件(如网页的跳转、网页加载)发生的前后来调用这些方法。View 可以在不知道某个类的细节的情况下,把该类设置成自己的 Delegate,只要目标类实现了 Protocol 中的必须实现的方法。这些 Protocol 中的方法的命名是有规律的,通常会包含三种关键字:
will: 表示这个方法会在某种事件 发生前 调用。
did: 表示这个方法会在某种事件 发生后 调用。
should: 通常用来确定 该不该让某件事发生 。如 webView:shouldStartLoadWithRequest:navigationType: ,它的返回值是布尔型,当返回 NO 时,WebView 将不会加载内容。
Model 与 Controller
Controller 直接向 Model 请求数据。一般将 Model 的类作为 Controller 的属性,直接调用相应的实例方法或者类方法即可。
Model 通过 Notification 和 KVO 将数据的变化通知给 Controller。KVO 是指 Key-value observing,是一种观察者模式的实现,可以使得 Controller 在 Model 的数据变化时能够得到通知。Notification 是另外一种系统提供的通知机制,与 KVO 的直接通知到观察者对象不同,系统提供了一个 NotificationCenter 来广播通知。两者都可以实现一对一或一对多的关系。
附白胡子老头 mvc 的demo便于理解。如果嫌麻烦,本人谢了几行代码,可以看一下demo
mvvm浅析
本来打算自己写,查资料时发现了这篇博文非常不错,就直接拿来主义了
来自
http://mobile.51cto.com/iphone-475071.htm###
附带demo