iOS设计模式----MVVM + ReactiveCocoa
2019-07-18 本文已影响3人
陌路卖酱油
前言
我负责努力,其余交给运气。
最近开始写笔记才发现,其实整理出来的东西,哪怕之前看过、学过,可是依然可以学习到一些新的东西,颇有一种温故而知新的感觉,哈哈...
一、MVVM
1.1 MVVM简介
MVVM是Model-View-ViewModel的简写。在典型的 MVC 应用里, 许多 逻辑被放在 View Controller 里。它们中的一些确实属于 View Controller,但更多的是所谓的“表示逻辑”(presentation logic);为了不让控制器日益臃肿,便于测试管理,便出现了MVVM。

MVVM模式是通过下面三个核心组件组成,每个都有它自己所要处理的事情:
- Model :数据模型
- View :用来将Model 的内容显示出来
- ViewModel :扮演“View”和“Model”之间的使者,帮忙处理 View 的业务逻辑
MVVM最基本的规则:
-
1.View持有ViewModel 反之不持有(即不要在viewModel中引入UIKit.h,任何视图本身的引用都不应该放在viewModel中);
-
2.ViewModel持有Model 反之不持有
1.2 MVVM的优势
- 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
- 可重用性:可以把一些视图逻辑放在一个 viewModel里面,让很多 view 重用这段视图逻辑。
- 独立开发:开发人员可以专注于业务逻辑和数据的开发 (viewModel),设计人员可以专注于页面设计。
- 可测试:通常界面是比较难于测试的,而 MVVM 模式可以针对 viewModel来进行测试。
1.3 MVVM的弊端
- 1.数据绑定使得Bug很难被调试。如果界面发生错误,有可能是View的代码有问题,也有可能是Model的代码有问题。数据绑定使得一个位置的Bug被快速传递到别的位置,要想定位原始出问题的地方,就变得不那么容易了。
- 2.对于大型项目,数据绑定和数据转化需要花费更多的内存(成本)。主要在于:数组内容的转化成本较高:数组里面每项都要转化成Item对象,如果Item对象中还有类似数组,就很头疼。转化之后的数据在大部分情况是不能直接被展示的,为了能够被展示,还需二次转化。只有在API返回的数据高度标准化时,这些对象原型(Item)的可复用程度才高,否则容易出现类型膨大,提高维护成本。
- 3.调试时通过对象原型查看数据内容,不如直接通过NSDictionary或者NSArray这样直观。
- 4.同一API的数据被不同View展示时,难以控制数据转化的代码,它们有可能会散落在任何需要的地方。
注:
- ViewController尽量不要涉及业务逻辑,让ViewModel去做业务逻辑;ViewController 只是一个“中间人”,接收View的事件、调用ViewModel的方法、响应ViewModel的变化;ViewModel 绝不能包含视图View(UIKit.h),否则就跟View产生耦合,不方便复用和测试。
- ViewModel之间可以有依赖;ViewModel要避免过于臃肿冗余,否则讲重蹈Controller的覆辙,变得难以维护。

持续更新中....