浅谈MVC和MVVM模式
MVC
I’m dating with a model… and a view, and a controller.
众所周知,MVC 是开发客户端最经典的设计模式,iOS 开发也不例外,但是 MVC 有让人无法忽视的严重问题。
MVC, short for Massive View Controller
在通常的开发中,除了简单的 Model、View 以外的所有部分都被放在了 Controller 里面。Controller 负责显示界面、响应用户的操作、网络请求以及与 Model 交互。这就导致了 Controller:
- 逻辑复杂,难以维护。
- 和 View 紧耦合,无法测试。
Model View ViewModel

既然 View 和 Controller 是一对好基友,在 MVVM 里面,干脆把它们当做 View。
现在将原来 Controller 的部分职责拆分出来由 View Model 承担,主要包括:
- 校验用户输入。
- 网络请求。
- 展示层的逻辑,比如格式化字符串。
- 其他不能放入 Model,与 View 无关的逻辑。
原来的 Controller 现在只负责绑定 View 和 ViewModel。值得注意的是,View Model 不包含与 View 直接关联的部分。一般来说,只要代码中没有#import <UIKit/UIKit.h>即可。
MVVM 的优点
- MVVM 兼容 MVC,可以先创建一个简单的 View Model,再慢慢迁移。
- MVVM 使得 app 更容易测试,因为 View Model 部分不涉及 UI。
MVVM 最好配合 binding 机制,Model 的变化需要同步到 View Model,View Model 的变化也需要同步到 View。ReactiveCocoa 就可以用来实现 binding,当然它能做的远远不止 binding。
Ref
http://www.teehanlax.com/blog/model-view-viewmodel-for-ios/
https://www.objc.io/issues/13-architecture/mvvm/
之前浅入理解MVC和MVVM
MVC
模型-视图-控制器(Model-View-Controller)
- Model和View永远不能相互通信,只能通过Controller传递。
- Controller可以直接与Model对话(读写调用Model),Model通过Notification和KVO机制与Controller间接通信。
- Controller可以直接与View对话,通过outlet,直接操作View,outlet直接对应到View中的控件,View通过action向Controller报告事件的发生(如用户Touch我了)。Controller是View的直接数据源(数据很可能是Controller从Model中取得并经过加工了)。Controller是View的代理(delegate),以同步View与Controller。
iOS 中的 MVC
所谓的 MVC 是指:
- Model: 数据的拥有者,实现具体的业务逻辑。
- View: 具体的用户界面,如按钮、列表、图片。
- Controller: 负责将 View 中用户的动作传达给 Model,将 Model 的数据通过 View 展现出来。
通常 iOS 的每个场景(scene)都由一个 ViewController 来管理,这个 ViewController 可以是库中原生的,更多情况下是我们自定义的,但是都继承自 UIViewController。顾名思义,ViewController 包含了 MVC 中的 Controller 和 View,其中的 View 一般是系统提供的 UIButton、UILabel 等类的实例。而 Model 一般都是我们自定义的类。
MVC 之间的交互

1.View 与 Controller
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 将不会加载内容。
2.Model 与 Controller
Controller 直接向 Model 请求数据。一般将 Model 的类作为 Controller 的属性,直接调用相应的实例方法或者类方法即可。
Model 通过 Notification 和 KVO 将数据的变化通知给 Controller。KVO 是指 Key-value observing,是一种观察者模式的实现,可以使得 Controller 在 Model 的数据变化时能够得到通知。Notification 是另外一种系统提供的通知机制,与 KVO 的直接通知到观察者对象不同,系统提供了一个 NotificationCenter 来广播通知。两者都可以实现一对一或一对多的关系。
3.Model 与 View
他们不能相互发送信息。
MVVM
Model -ViewModel - View
什么是 MVVM:一个 MVC 的增强版,我们正式连接了视图和控制器,并将表示逻辑从 Controller 移出放到一个新的对象里,即 View Model。MVVM 听起来很复杂,但它本质上就是一个精心优化的 MVC 架构
Model层是少不了的了,我们得有东西充当DTO(数据传输对象),当然,用字典也是可以的,编程么,要灵活一些。Model层是比较薄的一层,如果学过Java的小伙伴的话,对JavaBean应该不陌生吧。
ViewModel层,就是View和Model层的粘合剂,他是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。说白了,就是把原来ViewController层的业务逻辑和页面逻辑等剥离出来放到ViewModel层。
View层,就是ViewController层和view,他的任务就是从ViewModel层获取数据,然后显示。
浅谈MVC和MVVM模式的更多相关文章
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
- 浅谈MVC MVP MVVM
复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用. 它本身很容易理解,但是要讲清楚,它与衍生的 MVP ...
- 浅谈MVC、MVVM的区别
一.概述 MVC,MVP,MVVM是三种常见的前端架构模式(Architectural Pattern),它通过分离关注点来改进代码组织方式.不同于设计模式(Design Pattern),只是为了解 ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 浅谈 MVC 和 MTV
浅谈 MVC 和 MTV 一.MVC M:model,模型,就是数据模型,负责数据的存取: V:view,视图,负责页面的展示逻辑: C:controller,控制器,负责业务逻辑的处理: 二.MTV ...
- 浅谈MVC模式与MVVM模式的区别
MVC模式: M:Model(数据模型),用于存放数据 V:View(视图),也就是用户界面 C:Controller是Model和View的协调者,Controller把Model中的数据拿过来给V ...
- 浅谈MVC、MVP、MVVM模式
mvc的模式已经深入人心,想必大家都很熟悉,但是未必都能遵守mvc模式.我们的一个mvc项目比较简单,主要是数据库的查询.一个DBHelp类,封装了数据库的操作,然后Controller中进行中各种查 ...
- 浅谈MVC、MVP、MVVM
MVC M: Model 模型——数据 (对于前台而言例如:ajax.jsonp等从后台获取数据的) V: View 视图——表现 ...
随机推荐
- java依赖的外部文件路径的获取
在开发阶段一直使用以下方式调试没有问题: String path = KStream104.class.getResource("/").getFile().toString(); ...
- Hibernate- 连接查询
01.搭建开发环境 02.连接查询 package com.gordon.test; import java.util.Arrays; import java.util.List; import or ...
- 判断list为空的条件
if(list!=null&&!list.isEmpty()){ hql.append(" and (status = ? or sta ...
- IE文字重复显示的处理
<body> <div id="container"> <!-- // 页头 --> <div id="header" ...
- 關於 WebClient wc = new WebClient() 下載第三方數據不能進安安信任異常
報錯異常:The underlying connection was closed: Could not establish trust relationship for SSL/TLS secure ...
- Windoows窗口程序五
程序执行机制 过程驱动-程序的执行过程是按照预订好的顺序执行. 事件驱动-程序的执行是无序,用户可以根据需要随机触发相应的事件. Win32窗口程序就是采用事件驱动方式执行,也就是消息机制. 当系统通 ...
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可. 1.抛异常强制退出: 该方法通过抛异常,使程序ForceClose. 验证可以,但是,需要解决的问题是,如何使程序结束掉,而 ...
- RBAC 基于角色的访问控制
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- MySQL 常用语法 之 DISTINCT
DISTINCT作用很简单就是去除重复行的数据. 具体看下面列子 表A数据[两条 nami 99] nameA scoreA robin 98 nami 99 saber 98 lu ...
- java_Observer Design Pattern
摘自: http://www.ntu.edu.sg/home/ehchua/programming/java/J4a_GUI.html Creating Your Own Event, Source ...