iOS-MVVM-模式介绍

一、MVVM概述  
 
MVVM 到底是什么?我们首先看一下MVC架构:

iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记

我们看到的是一个典型的 MVC 设置。Model 呈现数据,View 呈现用户界面,而 View Controller 调节它两者之间的交互。Cool!

稍微考虑一下,虽然 View 和 View Controller 是技术上不同的组件,但它们几乎总是手牵手在一起,成对的。你什么时候看到一个 View 能够与不同 View Controller 配对?或者反过来?所以,为什么不正规化它们的连接呢?



这更准确地描述了你可能已经编写的 MVC 代码。但它并没有做太多事情来解决 iOS 应用中日益增长的重量级视图控制器的问题。在典型的 MVC 应用里,许多逻辑被放在 View Controller 里。它们中的一些确实属于 View Controller,但更多的是所谓的“表示逻辑(presentation logic)”,以 MVVM 属术语来说,就是那些将 Model 数据转换为 View 可以呈现的东西的事情,例如将一个 NSDate 转换为一个格式化过的 NSString。

我们的图解里缺少某些东西,那些使我们可以把所有表示逻辑放进去的东西。我们打算将其称为 “View Model” —— 它位于 View/Controller 与 Model 之间:

                      iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记

看起好多了!这个图解准确地描述了什么是 MVVM:一个 MVC 的增强版,我们正式连接了视图和控制器,并将表示逻辑从 Controller 移出放到一个新的对象里,即 View Model。MVVM 听起来很复杂,但它本质上就是一个精心优化的 MVC 架构,而 MVC 你早已熟悉。

        MVVM模式中取消了控制器的概念,将View和ViewController整合成了View的概念,因为在iOS开发中,UIViewController本来就是Controller和View的一个集合。


二、MVVM实现

现在我们知道了什么是 MVVM,但为什么我们会想要去使用它呢?在 iOS 上使用 MVVM 的动机,对我来说,无论如何,就是它能减少 View Controller 的复杂性并使得表示逻辑更易于测试。通过一些例子,我们将看到它如何达到这些目标。

此处有三个重点是我希望你看完本文能带走的:
      (1)MVVM 可以兼容你当下使用的 MVC 架构。
      (2)MVVM 增加你的应用的可测试性。
      (3)MVVM 配合一个绑定机制效果最好。 

如我们之前所见,MVVM 基本上就是 MVC 的改进版,所以很容易就能看到它如何被整合到现有使用典型 MVC 架构的应用中。让我们看一个简单的 Person Model 以及相应的 View Controller:

iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记
 
Cool!现在我们假设我们有一个 PersonViewController ,在 viewDidLoad 里,只需要基于它的 model 属性设置一些 Label 即可。

iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记
 
这全都直截了当,标准的 MVC。现在来看看我们如何用一个 View Model 来增强它。

iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记

我们的 View Model 的实现大概如下:

iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记

Cool!我们已经将 viewDidLoad 中的表示逻辑放入我们的 View Model 里了。此时,我们新的 viewDidLoad 就会非常轻量:
iOS-MVVM-模式介绍 - 梁敬承 - 梁敬承技术笔记

所以,如你所见,并没有对我们的 MVC 架构做太多改变。还是同样的代码,只不过移动了位置。它与 MVC 兼容,带来更轻量的 View Controllers。

以上转载自:http://mobile.51cto.com/iphone-475071.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据库]---mysql数据库 使用binlog+canal或binlake进行数据库的复制

前言 在进行冷热分离的时候,需要将数据实时的复制在历史数据库中,我们使用的是binlogcanal的思想,将每次数据库数据的变更转换成消息发出来,然后再操作这些消息达到数据复制的 在京东,实现同样功能的组件,叫binlake 接下来详细说下: 1.Binl…

加密算法概念简介--MD5、SHA、DES、3DES、AES、RSA、ECC

MD5MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字&…

MAC下配置ZSH

MAC下面的终端是神器。而且苹果非常贴心的为我们准备好了ZSH。 可惜ZSH不是很好用,需要配合一些插件和模板:oh-my-zsh将bash切换为zsh chsh -s /bin/zsh其实还可以用which来定位(特别是ubuntu的童鞋) chsh -s which zsh 直接用zsh…

搭建: canal部署与实例运行

搭建: canal部署与实例运行 数据库读log同步用 详见下面

MAC下使用OpenSSL生成私钥和公钥

MAC OS自带了OpenSSL,直接在命令行里使用OPENSSL就可以。打开命令行工具,然后输入 openssl打开openssl,接着只要三句命令就可以搞定。1、打开Terminal--cd 到指定文件夹,如桌面Mac:~/Desktop $ openssl2、第一句命令:生成私钥&…

idea插件开发(01)---最简单的helloworld版,不需要知道原理,先跟我做一个最简单的弹框插件

前言 用了那么多idea插件,也想自己做一个插件,下面就是入门版本 你不需要先知道所有的概念,先跟着我的步骤做一个小;例子,后面再说原理 相关概念看后面一篇 本次以windos系统为例 开始 1.你得安装一个环境,供idea插件的开发使用 下载地址: https://www.jetbrains.com/idea/…

苹果封装的对称加密和非对称加密API

一、信息摘要算法5&#xff1a;MD51.系统库位置&#xff1a;<CommonCrypto/CommonHMAC.h>。2.非加密算法&#xff0c;属于哈希散列&#xff0c;不可逆&#xff0c;用于检验数据完整性。二、安全散列(哈希)算法SHA&#xff1a; 1.包含的散列算法&#xff1a;SHA-1&#xf…

RSA算法原理

一、RSA算法数论&#xff1a;将两个大素数相乘十分容易&#xff0c;但是想要对其乘积进行因式分解却极其困难&#xff0c;因此可以将乘积公开作为加密密钥。二、RSA算法涉及三个参数&#xff0c;n、e1、e2。三、公私钥生成过程1、首先&#xff0c;需要两个大质数&#xff0c;p和…

idea插件开发(02)---相关概念介绍

上一篇已经介绍了idea插件开发最简单的一个例子 本篇来说说相关概念,部分概念是网上抄的,网友的不同说法,但大致都是同一个意思 1.idea介绍 idea整个组件结构是基于PicoContainer的,他是一个嵌入式的Ioc容器,有点像Spring的容器 我们做的idea插件,作为扩展功能组件,可以添加到…

ECC椭圆曲线加密算法原理

比特币使用椭圆曲线算法生成公钥和私钥&#xff0c;选择的是secp256k1曲线。与RSA&#xff08;Ron Rivest&#xff0c;Adi Shamir&#xff0c;Len Adleman三位天才的名字&#xff09;一样&#xff0c;ECC&#xff08;Elliptic Curves Cryptography&#xff0c;椭圆曲线加密&…

mysql报错 DuplicateKeyException分析与解决

在做数据库同步的时候,发现一个错误,mysql报错如下: org.springframework.dao.DuplicateKeyException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:XXX ### The error may involve com.jd.medicine.b2…

[运维]---linux机器一般监控用到的概念记录

发布在linux上的机器,一般我们需要监测各项数据来证实服务器是没问题的, 如果出现问题,我们也可以通过以下指标找到问题的方向 容器指标硬件指标磁盘指标系统指标网络指标 容器指标 线程数 -当前容器内线程总数&#xff08;平均到每个核的线程数&#xff09;进程数 -当前容器…

SHA算法原理

一、SHA1算法简介 安全哈希算法&#xff08;Secure Hash Algorithm&#xff09;主要适用于数字签名标准&#xff08;Digital Signature Standard DSS&#xff09;里面定义的数字签名算法&#xff08;Digital Signature Algorithm DSA&#xff09;。对于长度小于2^64位的消息&am…

[数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用

mysql插入一条数据方式有四种,接下来逐个说明验证: 前提: 有一个表,作为本次测试: CREATE TABLE zs_test (id int(11) NOT NULL AUTO_INCREMENT,order_id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY order_id_index (order_id) ) EN…

DES加密算法原理

一、DES算法理论 本世纪五十年代以来&#xff0c;密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼 &#xff08;Tuchman&#xff09;和麦耶&#xff08;Meyer&#xff09;根据信息论创始人香农&#xff08;Shannon&#xff09;提出的「多重加密有…

[python]---从java到python(01)---基础与入门上手

前言 我本是java派的,已经有几年了,直接也接触过其他语言,比如从最早的汇编语言到高级语言始祖的C; 但是近来越发觉得python很火,现在以我的视角开始写入门python基础,算是入坑了; 我的计划是这个系列要更契合那些有java基础的同胞们,用你们已有的java基础,用对比的方式,更快的…

AES加密算法原理

一、摘要 AES&#xff08;The Advanced Encryption Standard&#xff09;是美国国家标准与技术研究所用于加密电子数据的规范&#xff0c;在2002年5月26日建立。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。AES 是一个新的可以用于保护电子数据的加密算法…

java获取本机ipv4,并使用Google Guava 缓存

java写个util,获取本机ip,并使用Google Guava 缓存起来 四个方法: 获取本机ipv4ip转16进制16进制转ip校验ip 首先,Google Guava使用的maven配置 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version&g…

OpenSSL库概述

一、背景技术SSL是Secure Sockets Layer&#xff08;安全套接层协议&#xff09;的缩写&#xff0c;可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时&#xff0c;提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户…

短信微信等消息发送系统的架构设计

消息发送系统 项目中的一种做法,简化总结如下 1.对外暴露接口1,供业务方调用 2.接口2的实现就是同步发送各种消息,比如发短信,发微信等,但不保证 3.对外暴露接口2,供业务方调用 4.接口2内部实现,也是发送消息,但是是通过mq解耦的 4.1.业务方调用接口2后,接口2的实现将会发送一…