本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-

真的理解MVC吗?

从刚开始做iOS项目的时候,就知道要使用MVC,虽然不懂为什么但总是会建三个文件夹。写的东西多了见的东西多了才发现还欠MVC一次总结。

为了有权威性先摆上斯坦福大学公开课上的一幅图:

这幅图需要注意以下几点:
Model:数据模型,负责数据的获取及存放,数据的获取可能是网络请求也可能是本地数据库访问,存放是指数据解析之后放在Model中方便Controller提供给View使用。

View:视图,负责UI的展示,它是需要数据的。

Controller:控制器,协调数据和视图(将Model中的数据提供给视图)。

Controller持有Model和View,Model和View之间不应该持有、也就是Model不能直接和View通信,这体现出了MVC数据模块与视图模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性。

Model和Controller之间采用KVO和Notification通信,为什么不用Block和代理?从技术上是可以的,但是在MVC中,Model不需要知道被Controller持有,KVO和Notification在解耦和方面比Block要好,但是Block很方便,使用全凭个人爱好。

Controller和View采用委托(代理和数据源)或target-action,前者的典型UITableView,后者诸如UIButton等。

知道了这些就可以用MVC写东西了,但是似乎Model这块怎么写还是不是那么的清楚?而且很容易写成Massive View Controller 模式。就比如在Controller中直接使用AFNetwrking请求、然后将请求的数据在Controller中解析成Model,这是最不推荐的一种写法,AFNetworking如果不维护了呢?这样写Controller里代码增加了多少?这里我给出一种MVC的Demo供大家借鉴,这里我将每个网络请求都封装成了一个类。另外给出一个我看到并受益的观点:
1、将 UITableView 的 Data Source 分离到另外一个类中。
2、将数据获取和转换的逻辑分别到另外一个类中。
3、将拼装控件的逻辑,分离到另外一个类中。

MVVM的出现

MVVM是MVC发展的产物,从命名中可以看出这种模式减少了Controller的职责。

在这种模式下:
Model的职责依然是获取数据,但不会去负责给View提供数据了。
View-Model负责将Model获取的数据解析成View所需要的数据模型。
而此时Controller则不再需要负责Model转换的逻辑了(事实上、上面MVC的demo中我就已经优化了这一点、因为MVC并没有指出数据解析应该放在哪里)。
view的任务就是呈现由view-model提供的数据。

如果只有以上这些不同,你可能会觉得这跟MVC根本没什么差异。MVVM 在使用过程中,通常还会利用双向绑定技术:Model 变化时,ViewModel 会跟着自动改变,而 ViewModel 变化也会引起 View 自动变化。
iOS 中,可以使用 KVO 或 Notification 实现。而且,GitHub 开源的 ReactiveCocoa 可以很优美的实现这种绑定。当然ReactiveCocoa还可以用在很多地方。
我会给出两个Demo,一个是使用KVO实现的MVVM,另一个使用RAC实现的MVVM。

这些Demo都很清晰明了,这里就不贴代码了,去Github上下载的时候记得点个赞哦!
这些Demo很能说明问题,但毕竟不是一个整体的项目、没有展示RAC如何使用,我过段时间会使用MVVM+RAC重写我以前上线的一个项目:玩转西邮,到时候也会放到Github上。

简单介绍一下RAC

ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和Mac OS开发的新框架。

ReactiveCocoa作用:
我们在iOS开发过程中,代理、KVO、点击事件等都可以通过RAC处理。
从上面MVVM+KVO的Demo中可以看出RAC非常符合高聚合,低耦合的思想。

ReactiveCocoa的思想:
ReactiveCocoa结合了函数式编程思想和响应式编程思想,所以ReactiveCocoa被描述为函数响应式编程(FRP)框架。

函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
响应式编程思想:如果 a = b + c ; b 或者 c 的值变化后,a 的数值会同时发生变化。
关于这两个思想我也写了Demo可以一并下载,关于思想的Demo参考自:http://www.jianshu.com/p/87ef6720a096中的代码(指明出处是最起码的尊重)。

本文所有Demo地址:https://github.com/iOSaFei/MVC-MVVM-ReactiveCocoa-

把复杂留给自己,把简洁留给他人。

MVC、MVVM、RaectiveCocoa的总结相关推荐

  1. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

    我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

  2. mvc mvvm mvp_mvc vs mvp vs mvvm

    mvc mvvm mvp 思想程序员(Thought Programmer) Nowadays we have many options when it comes to architecture d ...

  3. ios 设计模式 MVC ,MVVM

    如何理解MVVM设计模式 ViewModel层,就是View和Model层的粘合剂,他是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方.说白了,就是把原来View ...

  4. 前端框架MVC/MVVM分析系列

    Backbone Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代 ...

  5. android mvc mvp 简书,浅析 MVP,MVC,MVVM模式(Android)

    前言 当我们接手一个项目的时候,经常会发现一个activity或fragment动辄上千行甚至上万行代码,这给阅读带来很大的困扰,如果想读懂代码,需要花费很多时间跟精力.引起这个问题的原因想必大家都了 ...

  6. 【转】React Vue MVC MVVM MVP

    首先,在谈这个话题之前, 我们有必要了解一下库和框架的区别. 我们先来看react官网以及vue官网对他们的定位: react: vue: react我们不说了,官网上明明白白说了,人家是一个libr ...

  7. 第2章[2.3] 基于Ext JS的MVC/MVVM架构的应用开发模式

    Ext JS 对MVC 和MVVM两种架构都支持.这两种架构都是根据逻辑划分程序的代码,两种各有优劣. MVC是什么? Model, View , Control的首字母. 在MVC架构中,大多数类都 ...

  8. JavaScript富应用MVC MVVM框架

    对框架的挑选 Ember.js.Backbone.js.Knockout.js.Spine.js.Batman.js , Angular.js 1. 轻量级的应用选择哪一个会比较好? 2. 那一个比较 ...

  9. Ext JS 6.7 中文文档:应用架构介绍(MVC/MVVM)

    最近为了做内网的后台学了下 Ext JS,觉得挺有意思的,顺手翻译一下文档,主要是架构部分和核心概念部分. 这个文档是我目前看到的最好的关于 MVC.MVVM 的解释与探讨,十分值得参考. 本篇目录 ...

  10. MVC/MVVM模式特点及区别

    一.概述 目录 一.概述 二.MVC 四.总结 MVC,MVP,MVVM是三种常见的前端架构模式(Architectural Pattern),它通过分离关注点来改进代码组织方式.不同于设计模式(De ...

最新文章

  1. 前端的单页面模式和多页面模式
  2. Pascal 错误代码及含义
  3. Android Studio 项目打包成apk时 Signature Version 的选择
  4. 遇事不决,XGBoost,梯度提升比深度学习更容易赢得Kaggle竞赛
  5. python学习手册条件-总算晓得python学习手册正式版
  6. centos下搭建yum服务器
  7. 恢复WORD2010的默认模板2011-05-03
  8. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(2)
  9. 计算机二级access模考软件_计算机二级考前通关大礼包来啦!各科目模考软件、视频教程,更有往年真题、最新考纲等打包送!...
  10. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
  11. CSTAnbsp;【Computer-Supportedamp;n…
  12. 微信红包随机数字_微信红包随机算法初探
  13. 教学实验平台之三极管放大特性测试
  14. unable to find account data for the submitted AuthenticationToken
  15. 使用RoboCopy 命令[转载]
  16. 18秋计算机应用基础在线作业3,电子科大18秋《计算机应用基础(本科)》在线作业3...
  17. Word技巧:如何使用正则表达式高效替换
  18. 阿里云系统导出到本地虚拟机
  19. SaaS云服务应用的访问安全性分析
  20. 11个资源强大的网站!

热门文章

  1. EMLOG主题模板 - Fanly-MIP 1.4
  2. 【mysql】数据库查询手机号同时加密
  3. python暂停和恢复游戏,暂停/恢复中间的python脚本
  4. 基于RFID资产管理系统下的车辆位置管理,实时定位,RFID固定资产管理
  5. 【Android】Android主线程真的不让进行耗时操作吗?
  6. ArcGIS两种线简化算法和建筑物综合(面的简化和建筑物聚合)的参数计算方法
  7. java枚举类循环_(转载)java 枚举 循环遍历以及一些简单常见的使用
  8. 记一次真实的网站被黑经历
  9. 我的世界:1.14版6大新型村庄种子,抢先体验官方推荐的雪村!
  10. 简单了解一下拉线式位移传感器及线性度是如何表示的?