目录
一、什么是MVVM
MVVM(Model - View/ViewController - ViewModel)是对MVC的一种变形设计模式,解决ViewController代码臃肿、View和Model模块耦合严重两个主要问题。抽出ViewModel来处理ViewController的业务逻辑,分离了UI代码和业务逻辑,并且ViewModel监听model事件,一旦发生变化更新视图,很好的解决了视图与模型的依赖性。看下图:
在MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件; view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel);viewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方。
二、为什么使用MVVM
虽然MVC 依然是目前主流客户端编程框架,但同时它也被调侃成Massive View Controller(重量级视图控制器),想必大家在开发中无可避免被下面几个问题所困扰:
- 厚重的ViewController
- 遗失的网络逻辑
- 较差的可测试性
为了避免和解决上述问题的产生,从MVC引申出来一种维护性较强、耦合性低的新的架构MVVM,主要目的是为了分离视图(View)和模型(Model)。
MVVM优势:
- 低耦合:View 可以独立于Model变化和修改。
- 可重用性:可以把一些视图逻辑放在一个 viewModel里面,让很多 view 重用这段视图逻辑。
- 独立开发:开发人员可以专注于业务逻辑和数据的 viewModel开发。
- 可测试:通常界面是比较难于测试的,而 MVVM 模式可以针对 viewModel来进行测试。
- 兼容性:MVVM 可以兼容当下使用的MVC架构, 增加应用的可测试性。
三、RAC
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。结合了几种编程风格:函数式编程 和 响应式编程 ,使用RAC解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。
函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
响应式编程思想:不需要考虑调用顺序,只需要考虑结果,产生一个事件,事件传播出去,然后影响结果。
3.1 RAC的用法
在RAC中最核心的类RACSignal:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。
注意:
- 信号类(RACSignal),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
- 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
- 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
RACSignal使用步骤:
- 创建信号 + (RACSignal *)createSignal:(