iOS MVVM使用要点


  • 一、前言
  • 二、MVC
  • 三、 MVVM
    • 3.1 基本概念和注意事项
    • 3.2 使用要点
    • 3.3 优势
    • 3.4 弊端
  • 四、ReactiveCocoa

一、前言

网上文章真的很多,在此简单的说一些要点和自己的看法。参考以下这篇文章:

  • iOS 关于MVC和MVVM设计模式的那些事

二、MVC

MVC 兼顾 ViewModel 的中间处理,还有很多例如网络请求等很多业务逻辑判断,难免不小心就臃肿厚重。

三、 MVVM

3.1 基本概念和注意事项

  1. ViewView controller都视为 View
  2. View不能直接引用 Model,而是引用 ViewModel
  3. ViewModel 引用 Model,但反过来不行(任何视图本身的引用都不应该放在 ViewModel 中);
    ViewModel 是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方。
  4. 使用 MVVM 会轻微的增加代码量,但总体上减少了代码的复杂性。

3.2 使用要点

  1. MVVM 可以兼容你当下使用的 MVC 架构;
  2. MVVM 增加你的应用的可测试性;
  3. MVVM 配合一个绑定机制效果最好(PS:ReactiveCocoa);
  4. ViewController 尽量不涉及业务逻辑,让 ViewModel 去做这些事情;
  5. ViewController 只是一个中间人,接收 View 的事件、调用 ViewModel 的方法、响应 ViewModel 的变化;
  6. ViewModel 绝对不能包含视图 View(UIKit.h),不然就跟 View 产生了耦合,不方便复用和测试;
  7. ViewModel 之间可以有依赖;
  8. ViewModel 避免过于臃肿,否则重蹈 Controller 的覆辙,变得难以维护。

3.3 优势

低耦合:View 可以独立于 Model 变化和修改。

可重用性:
可以把视图布局放在一个 ViewModel 里面,让很多 View 重用这段视图逻辑;
也可以把视图布局仍放在 View 里,多个 ViewModel 公用一个布局一致的 View

独立开发:开发人员可以专注于业务逻辑和数据的开发 ViewModel,设计人员可以专注于页面设计。

可测试:通常界面是比较难于测试的,而 MVVM 模式可以针对 ViewModel 来进行测试。

3.4 弊端

Bug 很难被定位:

首先,很多人觉得这样查找 bug 更加麻烦了,因为毕竟要多跳转一层 ViewModel

但是当你熟练使用 MVVM 后,你找到 View 使用的 ViewModel,然后清楚的定位数据和逻辑问题在 ViewModel 中。

这里就要强调上面说的一定要层次分明的使用 ViewModel,不能是 ViewModel 中引用 ViewView 中又包含该放在 ViewModel 中的逻辑,这样的话 bug 自然难以定位了。

ReactiveCocoa:

MVVM 一致强调和 RAC 同时使用会更加方便。

不使用 RAC :ViewModel 处理完数据需要刷新 View 等操作都是通过 Block 回调来实现,不免是有些麻烦的。

使用 RAC :View 初始化的时候就和 ViewModel 进行绑定,只要 ViewModel 的数据有所变化,便自动更新 View

RAC 缺点:数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。

四、ReactiveCocoa

  • 最快让你上手ReactiveCocoa之基础篇

  • 最快让你上手ReactiveCocoa之进阶篇

响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
代表:KVO运用。

ReactiveCocoa 常见宏:

  1. RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定。
 // 只要文本框文字改变,就会修改label的文字
RAC(self.labelView,text) = _textField.rac_textSignal; 
  1. RACObserve(self, name):监听某个对象的某个属性,返回的是信号。
[RACObserve(self.view, center) subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

你可能感兴趣的:(iOS MVVM使用要点)