MVC

I’m dating with a model… and a view, and a controller.

众所周知,MVC 是开发客户端最经典的设计模式,iOS 开发也不例外,但是 MVC 有让人无法忽视的严重问题。

MVC, short for Massive View Controller

在通常的开发中,除了简单的 Model、View 以外的所有部分都被放在了 Controller 里面。Controller 负责显示界面、响应用户的操作、网络请求以及与 Model 交互。这就导致了 Controller:

  • 逻辑复杂,难以维护。

  • 和 View 紧耦合,无法测试。

于是微软的大牛提出了 MVVM

Model View ViewModel

MVVM on iOS - 图1既然 View 和 Controller 是一对好基友,在 MVVM 里面,干脆把它们当做 View。
现在将原来 Controller 的部分职责拆分出来由 View Model 承担,主要包括:

  • 校验用户输入。

  • 网络请求。

  • 展示层的逻辑,比如格式化字符串。

  • 其他不能放入 Model,与 View 无关的逻辑。

原来的 Controller 现在只负责绑定 View 和 ViewModel。值得注意的是,View Model 不包含与 View 直接关联的部分。一般来说,只要代码中没有#import <UIKit/UIKit.h>即可。

MVVM 的优点

  • MVVM 兼容 MVC,可以先创建一个简单的 View Model,再慢慢迁移。

  • MVVM 使得 app 更容易测试,因为 View Model 部分不涉及 UI。

MVVM 最好配合 binding 机制,Model 的变化需要同步到 View Model,View Model 的变化也需要同步到 View。ReactiveCocoa 就可以用来实现 binding,当然它能做的远远不止 binding。

Ref