8

看了很多关于干净的iOS架构VIPER的文章,我明白了主要目的:关注点分离。

我目前将它用于我的项目。我有模块,每个模块都由视图、交互器、演示者、实体和路由器(带有情节提要)分割。

我有一个模块:地址和一个子模块 Add 用于添加地址页面。

所以,我的协议视图由我的 UIViewController 实现。视图控制器包含所有弱 IBOutlet 标签和文本字段(用于新地址表单)。

地址表单包含几个字段,例如:

  • 人的名字和姓氏
  • 邮政编码
  • 国家
  • 状态
  • 电话
  • 电子邮件
  • ETC...

在我的例子中,演示者只是将用户交互依赖于执行 API 调用的交互器。

但是,在执行 API 调用之前,我想预先验证表单以避免消耗无用的网络资源。

我需要检查例如:

  • 国家的内容并告诉视图如果为空则该字段是必需的...
  • 电子邮件的格式并告诉视图该字段无效...

我的问题是,我可以将表单验证代码放在哪里?

应该使用哪个 VIPER 组件来完成这项工作?

先感谢您!

4

4 回答 4

6

VIPER 的主要优势之一是关注点分离,因为信息被封装在适当的元素中。

Interactor 处理“业务逻辑”,其中包括大部分验证问题(部分验证可能由实体本身完成)。因此,视图会将其数据传递给 Presenter,Presenter 会将其提交给 Interactor,Interactor 将检查其业务有效性并要求实体告知其数据的一致性。

但是,使用库来加速您的开发可能会迫使您权衡封装以换取易用性。例如,SwiftValidator提供了相当广泛的验证规则,但要求您将UITextFields 传递给 Validator 组件。

因此,您可以在依赖交互器的更好封装架构(可能由Validators类似SwiftValidator.

于 2016-06-02T15:25:22.883 回答
2

看来您应该考虑为此目的使用SOA 架构方法。

一般来说,使用 VIPER 模块的应用程序的干净架构可以分为以下几层:

  1. 集会

    有所有与创建 viper 模块组件相关的代码。

  2. 介绍

    您应该保留 Animator、LayoutPerformer、Presenter、View、ViewController、Router 等组件。

  3. 商业逻辑

    它是为 Interactor 和一堆服务而设计的。理想情况下,每个服务都是无状态的,它使用来自核心组件层的类。例如,服务封装了一些网络客户端和请求,并产生一些模型作为输出。

  4. 核心组件

    这一层的目的与您的问题有关。这里是放置响应验证器、对象映射器、网络客户端等的地方。所以答案是放在核心组件层。

  5. 模型层

    它是应该保留所有实体的最深层。

好的,听起来不错,但是在这种情况下我该如何构建项目呢?

例如,您可以使用下面的结构。

--Modules
----Module
------Interactor
------Presenter
------Assembly
------Router
------View
--Services
--Core
----Validators
----Mappers
--Models

于 2017-04-11T12:27:19.457 回答
2

由于这与业务逻辑有关,我会说验证应该去交互器。您甚至可以创建将被称为表单交互器的工作器 - 如果您的验证太大,但交互器是执行此操作的地方。使用委托,您可以通知用户是否有问题、究竟是什么问题、错误消息等。

我也会参考http://clean-swift.com/clean-swift-ios-architecture/

于 2016-06-02T13:03:59.070 回答
0

您可以从这篇文章 ( https://www.ckl.io/blog/best-practices-viper-architecture )中查看这个样板文件 ( https://github.com/CheesecakeLabs/Boilerplate_iOS_VIPER ) 作为示例。

Presenter负责表单验证,但您不应该将代码留在 Presenter ifself 上。相反,请为 Presenter 调用 a FormValidationHelper()

于 2017-04-11T02:14:43.777 回答