iOS中的VIPER一文通😁

2020-08-21  本文已影响0人  sayHellooX

今天来介绍一个适合构建大型APP或比较大的模块的架构-VIPER;

为什么用VIPER?

什么是VIPER?

伴随着业务的增加、功能模块的增涨我们会发现,代码的结构越来越不清晰、测试也越来越难,陷入了一个恶性循环;

为了使得代码便于维护、结构更清晰、便于测试,这时候我们就需要一种好的架构方式来组织我们的APP代码,这时候VIPER就应运而生;

VIPER这个概念来自于Clean Architecture,VIPER是View, Interactor, Presenter, Entity,Routing,这几个单词的缩写;在Clean Architecture中将整个APP或者说模块用专门的不同的层次来分隔,这使得各个层之间减轻依赖,每个层次负责单一的功能,也符合功能单一的设计原则,也更加的便于测试;

拆分VIPER

viper1.png

View

View是被动的,它等待Presenter传递内容用于展示,它从不主动去向Presenter请求数据;

Presenter

Presenter是整个VIPER架构的核心,在Presenter中包含驱动UI的来逻辑,他知道什么时候展示什么界面;它负责收集从View中传递过来的数据或者事件,从而去驱动Interactor请求数据、或更新UI;当接收到Interactor传递过来的数据,在将数据转换成ViewModel后,将数据传递给View;

Interactor

Interactor包含Entity关联到具体业务的逻辑,比如只有符合某种条件的Entity才会被传递到Presenter,在其内部不应该和任何的UI产生依赖关系;因为Interactor负责的是纯业务逻辑,所以他应该很容易进行测试或者通过TDD进行开发;

Entity
Router

在VIPER中,页面的切换响应是由Presenter和Router一起承担的,由于Presenter负责收集用户的输入,所以他知道什么时候需要切换到哪个新的页面,而Router内包含有具体的切换方法,知道怎样去切换;

我们也可以将Router中创建整个模块的功能分离出来,创建一个单独的Buider模块,这就是VIPER-B;

更加详细的划分关于VIPER-B,见下图(图片的来源再这里):

viper3.png
其他模块介绍
Buider
Data Manager
Model
ViewModel

viper中各个模块的整合

我们知道了各个层次的职责,将所有的层次组合到一起才是一个完整的架构;怎样将这些不同的层整合到一起也是一个问题,根据简单复杂有两个办法;

方法1:
viper2.png
方法二:

同样通过协议代替上面的持有,将上面办法中的持有完全由代理代替,即Presentor、View各自成为各自协议的代理;但是需要注意避免循环引用及完全弱引用,其中一方的代理需要用强引用,一方代理需要弱引用;

相关资料

viper-demo-ios

13-architecture/viper/

ios-architecture-patterns

上一篇下一篇

猜你喜欢

热点阅读