我阅读了许多关于干净iOS架构VIPER的文章,我理解主要的主题:关注点的分离。
我目前将它用于我的项目。我有模块,每个模块由视图,交互者,演示者,实体和路由器(与故事板)分开。
我有一个模块:地址和子模块添加添加地址页面。
所以,我的UIViewController实现了我的协议View。 视图控制器保存所有弱IBOutlet标签和文本字段(用于新地址表单)。
地址表单包含以下几个字段:
在我的情况下,演示者只是将用户交互依赖于执行API调用的交互器。
但是,在执行API调用之前,我想预先验证表单以避免消耗无用的网络资源。
我需要检查一下:
我的问题是,我在哪里可以提交表单验证码?
哪个VIPER组件应该填补这份工作?
提前谢谢!
答案 0 :(得分:4)
VIPER的一个主要好处是关注点的分离,因为信息被封装在适当的元素中。
交互者处理"业务逻辑",其中包括大部分验证问题(部分验证可能由实体本身完成)。因此,视图会将其数据传递给Presenter,Presenter会将其引用到Interactor,Interactor将检查其业务有效性并要求实体通知它有关数据的一致性。
但是,使用库来加速开发可能会迫使您更换封装以方便使用。例如,SwiftValidator
提供了相当广泛的验证规则,但要求您将UITextField
传递给Validator组件。
因此,您可以选择依赖于Interactor的更好的封装体系结构(可能由像Validators
这样的库加强),或者更像MV SwiftValidator
的工具。
答案 1 :(得分:2)
由于这与业务逻辑有关,我想说验证应该转到交互方。您甚至可以创建将被称为表单交互器的工作者 - 如果您的验证太大,但是交互操作员就是这样做的地方。对于代理人,如果出现问题,出现了什么问题,错误信息等,您可以通知用户。
答案 2 :(得分:2)
您似乎应该考虑为此目的使用SOA architecture方法。
一般来说,使用VIPER模块的app的干净架构可分为以下几层:
汇编
所有代码都与创建viper模块组件有关。
演示文稿
你应该保留Animator,LayoutPerformer,Presenter,View,ViewController,Router等组件。
商业逻辑
它专为Interactor和一系列服务而设计。理想情况下,每个服务都是无状态服务,它使用Core Components层中的类。例如,服务封装了一些网络客户端和请求,并生成了一些模型作为输出。
核心组件
此图层的用途与您的问题相关联。这里有一个响应验证器,对象映射器,网络客户端等的地方。 所以答案是将它放入核心组件层。
模型图层
它是应该保留所有实体的最深层。
好的,听起来不错,但在这种情况下如何构建项目?
您可以使用例如下面的结构。
--Modules
----Module
------Interactor
------Presenter
------Assembly
------Router
------View
--Services
--Core
----Validators
----Mappers
--Models

答案 3 :(得分:0)
您可以在此帖子(https://github.com/CheesecakeLabs/Boilerplate_iOS_VIPER)中查看此样板(https://www.ckl.io/blog/best-practices-viper-architecture)以获取示例。
Presenter
负责表单验证,但您不应将代码保留在Presenter上。相反,请为演示者调用FormValidationHelper()
。