协调员基本教程。 第一部分

2015年,在著名的iOS会议NSSpain’15上,Soroush Khanlou作了介绍性演讲“ Presenting Coordinators”。 在这次演讲中,他描述了协调员的整个想法,并展示了一些用Objective-C编写的示例。 总体思想来自《企业应用程序体系结构模式》一书,该书解释了应用程序控制器模式,并被Soroush采纳用于移动开发。

您可以在此处查看演讲视频。

我一年前喜欢这个视频,整个想法给我留下了深刻的印象。 在二月的一个寒冷的夜晚,我用这种架构方法的第一次迭代编写了一个示例项目。 当然,我使用Swift作为主要语言。 之后,我一步一步改进了这种方法,并涵盖了越来越多的用例。 两个月后,我开始将协调器集成到生产应用程序中。 最初,协调员只驱动了少数功能,但最后,应用程序的框架却完全由它们驱动。 后来,我添加了深层链接支持,推送通知,强制触摸功能以及灵活的流程,所有这些都由协调员处理。 我现在想与您分享的是这种经历。

如果您想跳过我的解释并查看代码,请访问以下链接。 让我们从一堆问题开始。

什么是移动应用程序中的流程?

流是逻辑上链接的屏幕队列。 我们所有的屏幕都可以按流程划分:身份验证流程,电话验证流程,预订流程,个人资料编辑流程等。

我们通常如何管理流中的屏幕?

假设我们有一个身份验证流程,并且在流程中我们需要验证用户的电话。

让我们以这样的方案为例:

我们通常如何处理此流程中的导航?

在最常见的情况下,控制器告诉路由器推送新的控制器。 它在代码中的外观如下:

下一个常见情况是在控制器之间发送数据。

想象一下,我们有一堆控制器,我们需要在它们之间共享数据。 我们如何做到这一点?

使流独立的另一个常见原因是它们可以在不同地方重用的能力。 例如,假设您有一个电话验证流程,然后成功将其用作身份验证流程的一部分。 现在,如果您需要在配置文件中使用相同的流程,则可以。

引言摘要

直接处理流程的方法通常非常糟糕:

  • 控制器很难重用
  • 每个控制器都知道其他控制器
  • 很难改变流量
  • 很难测试

协调员

模组

首先,让我们介绍一下模块。 模块是MVC,MVP,MVVM和Viper架构方法的一种架构元素。 在最简单的情况下,对于MVC,模块是控制器,对于Viper,模块是Interactor-Presenter-View。

我们需要做的是编排模块。

什么是协调员?

协调器是一个对象,该对象处理导航流并在打开下一个链后共享下一个协调器的流处理。 这意味着协调员应仅在屏幕之间保持导航逻辑。 协调器可以保留对存储的引用,该存储包含工厂用于创建模块的数据,但是它们永远不能处理模块的业务逻辑,也不能驱动单元的行为。 只有在点击一个单元格后按下下一个屏幕时,才发生单元格交互。

我们为什么要使用它?

主要目标是承担模块之间的未链接责任,并彼此完全独立地构建模块。 迭代之后,我们可以轻松地以不同的流程重用它们。

回到前面的示例,让我们看一下如何改进身份验证流程。 首先,我们需要分离两个不同的流程:身份验证和电话验证。 拆分后,我们可以在所需的任何地方重复使用它们。

现在我们有两个分离的流程。

让我们来看看引擎盖。

协调员由哪些部分组成?

让我们从通用界面开始。

所有协调员必须遵守以下协议:

我们需要协调员做什么?

我们可以轻松更改想要使用的类的数量,但是通常的设置如下所示:

  • Router ,用于导航(Router仅用于路由!在我们的案例中是被动的)。
  • 模块的工厂 ,用于创建模块和注入所有依赖项。
  • 协调器的工厂 (可选),以防我们需要切换到其他流程。
  • 存储 (可选),仅当我们存储任何数据并将其注入模块中时。

协调器的初始化:

我们可以向存储添加其他逻辑,以将数据保存在磁盘上或将数据格式化为json。

结论

对于第一部分,这可能就足够了。 我们学到了什么好处?

  • 控制器对其他控制器一无所知
  • 控制器可以轻松集成到不同流程中
  • 控制器不会将数据发送给其他人
  • 易于重用
  • 简化测试

我强烈建议您下载项目示例。

第二部分在这里。