建筑设计模式:VIPER

抱歉,延迟了,但是在阅读了文章之后,我意识到NasaAPOD应用程序的当前安装方式对于实施VIPER并不是很有趣。 应用程序内部需要进行更多的交互,因此我回到了MVC,MVVM和MVP来全面实现相同的功能。 我所做的是添加了“收藏夹”功能,该功能只是将您的收藏夹移到表视图的顶部(实际上并没有保存任何内容)。 因此,至少MVP和VIPER现在更加有趣了。 我不确定的一件事是如何为单元设置演示者/交互者。 似乎应该有一个presenter / interactor组件,因为它还可以处理图像缓存。 但是我不能完全考虑如何确保我没有制造大量或可能泄漏的材料。

auth0.com教程肯定有很大帮助,所以我的VIPER应用程序很大程度上基于它。 我发现有些奇怪,但根据以前的工作是很正常的,是当用户点击某些内容时,它会通过演示者而立即返回视图。 例如,用户点击信息图标,视图告诉演示者用户点击,演示者返回查看告诉其发生点击并显示详细信息。

auth0网站还建议您不要手动创建所有文件(我做了🙃),他们建议使用工具为您生成文件。 因为我决定手动创建所有文件,所以我确实很难考虑应用程序所需的每个文件的所有交互和协议。 如此之多,以至于我把它抽了出来。

我所做的一件事有些不同,那就是该应用程序如何设置演示者和交互者。 auth0站点将这些变量公开,但是我想尽可能地保持所有私有。 所以我添加了attachView(viewInteractor:)attachInteractor(interactor:)attachPresenter(presenter:)函数。 您可以在下面看到完整的应用程序。

ashleyng /建筑设计模式

通过在GitHub上创建一个帐户来为ArchitectureDesignPatterns开发做出贡献。

github.com

到目前为止,这是最有趣的学习模式,并且肯定有很多设置需要使它起作用。 话虽如此,我现在不认为VIPER是我的选择。 我仍然不太了解Router部分,但是如果没有Router ,也许还有VIPER的味道?


比较MVVM和Viper架构:何时使用一种或另一种

TL; DR:设计良好的体系结构对于长期保持项目可维护性很重要。 在这篇文章中…

auth0.com

  • 视图,交互器,演示者,实体和路由器
  • 视图 —界面层(UIKit文件)。 视图负责显示演示者要求他们执行的操作,并将用户输入回传给演示者
  • Interactor —负责从模型层(使用网络或本地数据库)获取数据,并且其实现完全独立于用户界面。
  • 演示者 —查看逻辑以格式化要显示的数据。 这是MVVM中ViewModel完成的工作的一部分。 演示者从交互器接收数据,创建视图模型并将其携带到视图。 还对用户输入做出反应,请求更多数据或将其发送回交互器
  • 实体 -模型层职责的一部分。 没有业务逻辑的纯数据对象。 由交互者管理。
  • 路由器 -应用程序的导航逻辑。 示例:如果必须在iPad应用程序中重用相同的iPhone视图,则唯一可能改变的是视图的显示方式。 这使您的其他图层保持不变。

示例应用

视图

  • 它是被动的; 仅将接口事件传递给演示者,并在演示者通知时进行更新

互动者

  • 仅要求提供localDataManager (协议)的数据。 它不在乎什么用作本地存储,Core Data,Realm或其他内容。
  • Interactor通知演示者并发送检索到的内容。 给定的解决方案是,它返回一个空数组,但另一个选择是传播错误并让演示者使用。 然后,主持人将负责格式化视图的错误对象

主持人

  • 您可能已经注意到,演示者可能会越来越大。 发生这种情况时,将其分为两部分很有趣:演示者,它将仅接收数据并将其格式化回视图; 和事件处理程序,它将响应接口事件。

路由器

  • 在演示者和线框之间共享在模块之间导航的责任。 演示者接收用户输入并知道何时进行导航,而线框则知道如何进行导航。
  • 由于线框负责创建模块,因此在此处设置所有依赖项很方便。 呈现另一个模块时,线框接收将呈现该对象的对象,并向另一个线框请求呈现的模块

使用VIPER构建iOS应用程序·objc.io

objc.io出版有关iOS和OS X开发的高级技术和实践的书籍

www.objc.io

  • VIPER的不同层通过为应用程序逻辑和导航相关代码提供清晰的位置来帮助应对这一挑战。
  • 应用通常被实现为一组用例。 用例也称为验收标准或行为,用来描述应用程序的意图。 用例是负责业务逻辑的应用程序层。 用例应独立于它们的用户界面实现。 它们还应该很小并且定义明确。

互动者

  • 它包含操纵模型对象(实体)以执行特定任务的业务逻辑
  • 通常由Interactor来启动网络操作,但它不会直接处理网络代码。 它将询问依赖项,例如网络管理器或API客户端。

实体

  • 实体是由交互器操纵的模型对象。 实体仅由交互器操纵。 Interactor永远不会将实体传递到表示层(即Presenter)。

路由

  • 由于Presenter包含对用户输入做出反应的逻辑,因此Presenter知道何时导航到另一个屏幕以及导航到哪个屏幕。 同时,线框知道如何导航。 因此,演示者将使用线框执行导航。 它们共同描述了从一个屏幕到下一个屏幕的路线。