聊聊 iOS 开发里的 MVC 模式

Image1 icon

最近项目要重构,首当其冲的就是代码结构,因为很多原因之前很少考虑代码结构的事情。终于要抽出一部分时间来重构这个项目,首先是整个项目的结构和代码逻辑不太符合 MVC,又顺便了解了一下 iOS 里的 MVC 模式的概念。首先 MVC 模式不光定义了每一部分在整个应用中扮演的角色,也定义了各个部分相互沟通交流的方式。每一部分都扮演着不同的角色,分工明确,降低耦合,减少依赖,使得每一部分都能够复用,这也是 MVC 模式的意义和目的所在。下面就简单描述一下 MVC 模式里对每一个角色的职能和责任。

Model

Model 层对象应该是封装了一定的数据规范,并且定义了管理和处理这些数据的逻辑和计算。简单说就是 Model 对象不仅定义了数据结构,还要包括对数据结构的操作和处理逻辑。比如从网络、sqlite、UserDefault 里获取需要在 View 里展现的数据以及存入用户感兴趣的数据等等。其实 Model 里是包含业务逻辑的,这一点和 Web 开发差异很大,之前在用 Java 开发 Web 程序时使用 MVC,M 就是 POJO,只包括定义数据结构,不包含对这些数据的处理 (处理的部分放在一个叫 Service 层里),也称之为贫血模型。相对应的充血模型就类似这里的 M,是包含对数据的操作和处理,ROR 里的 ActiveRecord 就是这样的。

View

View 层的理解就很简单了,就是用户能看得见的东西,比如 UIKit 里的各种系统自带控件等。View 对象应该知道如何把自己展示给用户并且对用户的操作做出回应。View 层对象的主要用途在于展示出应用的 Model 层数据并且允许用户通过交互修改这些数据。

Controller

Image2 icon

Controller 层对象相当于一个中间人,负责协调应用中的 View 层对象和 Model 层对象的关系,也是 View 和 Model 相互沟通的媒介。除此之外,Controller 还负责组织和协调应用中的任务以及管理其他对象的声明周期。

相互的沟通

Image3 icon

Model 层不直接和 View 沟通,当 Model 层对象改变(比如通过网络获取到了新的数据),它会通知 Controller 对象,Controller 对象收到通知更新对应的 View。当 View 层有改变(比如用户通过交互创建或修改了数据,称为 User Action),View 会通过 Controller 对象去创建或修改 Model 层的数据。 Model 层和 View 层是相互不知道对方的,它们的沟通是通过 Controller 这个中间人来协调处理。