设计模式MVVM、MVC在iOS中实现对比

一个页面中涉及的逻辑主要有:创建UI控件、读取缓存数据、发送网络请求、处理请求返回数据、更新UI展示、处理用户触摸。如果不使用任何的设计模式,那么这个页面的代码就会很长、臃肿杂乱,难以维护、修改。

苹果官方是将MVC设计模式作为iOS APP的标准模式

MVC是最普遍认知的设计模式,MVC模式将页面的逻辑分为3块:Model(模型数据业务)、View(UI展示业务)、Controller(协调者-控制器)

这样的划分很好理解,维护时,只要找到对应的那一块进行修改就好了。

在iOS开发中,UIKIt框架是将控制器ControllerView进行绑定了的,每个控制器都有View对象,代码添加UI子控件细节或者在xib与storyboard中子视图可以直接与controller进行关联,都会导致控制器中难以避免很多本该View去负责的UI子控件细节处理放在了控制器Controller里面;而在Controller里面本身要处理的请求、控制器生命周期函数要处理的事情比较多的情况下,控制器就变得很臃肿。实际上这个设计模式在iOS中为:M-VC

MVVM设计模式介绍

M=Model, V=V+C, VM = ViewModel.  为什么会叫ViewModel?

先看这样划分后的分工:

View :UI界面的创建及根据传递的Model来更新视图的逻辑 。

Controller :负责控制器本身的生命周期,协调各个部分的绑定关系以及必要的逻辑处理。 

ViewModel :网络请求、返回数据逻辑和缓存读写。

 Model :用来将数据模型化,是数据查看更清晰,使用更方便。

查看了百度百科(解释很抽象)及网上博客的一些解释, 为什么会叫ViewModel? 总结来说就是:MVVM由MVP和WPF结合演变过来的,MVVM模式是将业务分为3块M-V-新对象,由于这个新对象是为View量身定制的(即它是视图的模型),被称为ViewModel。MVVM的核心是双向绑定。

MVVM的双向绑定

绑定的意思就是讲两个对象建立关联,其中一个改变另一个自动跟着变。假设Model与View绑定就意味着Model改变时View自动跟着变,不需要手动赋值那一步---即响应式

单向绑定:一般指模型数据变化触发对应的视图数据变化。

双向绑定:指模型数据,视图数据任意一方变化,都会触发另一方的同步变化。

双向绑定如何实现?

设计模式MVVM、MVC在iOS中实现对比_第1张图片
通信图

1. 实际开发中的做法:让Controller拥有View和ViewModel属性,VM拥有Model属性;Controller或者View来接收ViewModel发送的Model改变的通知

2. 用户的操作点击或者Controller的视图生命周期里面让ViewModel去执行请求,请求完成后ViewModel将返回数据模型化并保存,从而更新了Model;Controller和View是属于V部分,即实现V改变M(V绑定M)。如果不需要请求,这直接修改Model就是了。

3. 第2步中的Model的改变,VM是知道的(因为持有关系),只需要Model改变后发一个通知;Controller或View接收到通知后(一般是Controller先接收再赋值给View),根据这个新Model去改变视图就完成了M改变V(M绑定V)

使用RAC(RactiveCocoa)框架实现绑定可以简单到一句话概括:

ViewModel中创建好请求的信号RACSignal, Controller中订阅这个信号,在ViewModel完成请求后订阅者调用sendNext:方法,Controller里面订阅时写的block就收到回调了。

可以下载下面的demo看一下就知道了,demo写得很简单!

MVVM + RAC的使用

可以先通过博客了解RAC:RactiveCocoa的工作原理概括介绍

Demo地址: https://github.com/1ikeSmi1e/MVVM_use

设计模式的概括

不管是MVC\MVP\MVVM都是对页面逻辑业务的一种OOP的划分!

MVP设计模式是MVC的改进,MVVM是MVC的改革!在IOS中,MVP设计模式并不流行,MVVM维护性强、耦合度低、可以解决controller过于臃肿的问题;而MVC因为V和C总是成对出现,MVC实际上M-VC,耦合度还是高了;但是在一些简单逻辑的控制器里面MVVM写法还是麻烦了一点!

结论:主体使用MVC,局部看情况使用MVVM设计模式,这样比较适用于当前的iOS开发。

你可能感兴趣的:(设计模式MVVM、MVC在iOS中实现对比)