简介
最近半年在写app的时候,研究了一下各种iOS代码架构,最后选择了VIPER进行实践,在此对实践中遇到的各种设计问题做一番总结,并分享造出的轮子。VIPER演示demo:ZIKViper,模块路由工具地址:ZIKRouter。
对代码风格和架构有兴趣的同学,肯定都已经在很多地方见过各种架构的介绍。MVC、MVP、MVVM、VIPER,细分程度逐渐上升。这些架构设计大部分都是来自MVC,只是各自用不同的方式对MVC进行了细分,在此只对MVC、MVP和MVVM作精简介绍,想要详细了解可以参考这些文章:
iOS 架构模式–解密 MVC,MVP,MVVM以及VIPER架构,
MVC
Model-View-Controller
。MVC简单地将一个模块分为3部分:
- View是展示给外部的界面
- Model是Controller内部管理的数据模型,和各种数据操作工具
- Controller负责将Model的变化更新到View
- Controller负责处理来自View的事件
MVC的划分粒度很粗,因此有很多种具体实现,各个实现有差异,因此并没有一个十分明确的标准定义。
苹果的MVC
苹果的Cocoa Touch就遵照了MVC的设计,一个界面分为UIView和UIViewController,UIView负责渲染和接收触摸事件,UIViewController负责子view之间的布局、组合、更新以及事件处理。
尽管苹果已经给我们提供了简单的MVC支持,但是在实践中我们却常常没有遵守MVC。原因在于Cocoa Touch中的Model部分是由我们自己负责管理的,并没有提供原生的设计支持。所以有时候会出现这样的情况:一个UIView为了方便,提供了一个从某个model进行配置的方法。乍一看十分合理,但是仔细想想就会发现,这么做已经将View和Model耦合,不符合苹果官方的MVC规范(The Role of View Controllers)。
另外,UIViewController存在的一些问题,导致了它很容易变得臃肿和耦合。
首先,UI