如何实现流程协调器模式

通过查看此架构,我们看到协调器需要实例化,添加和删除其他协调器,实例化控制器,并知道如何在应用程序中导航。 没有一种方法可以实现这种逻辑。 如您所见,我的方法依赖于Andrey Panov的方法。

为了实例化协调器,我们使用CoordinatorFactory。

在BaseCoordinator中,我们具有添加和删除协调器的逻辑。 ChildCoordinators数组存储活动的协调器。 我们需要对它们有充分的参考,否则,它们将从内存中删除。

查看应用架构。 如果用户使用Profile VC,则Profile协调器位于Main协调器的childCoordinators变量中。 同时,主协调器位于应用程序协调器的childCoordinators变量中。 如果我们从Profile VC导航回A VC,则Main协调器将从childCoordinators数组中删除Profile协调器,我们将不再有强大的参考资料。

为了实例化视图控制器,我们使用ViewControllerFactory。 这个课很简单。 我们使用工厂模式来创建控制器。

对于路由,我们使用一个Router对象。 它具有对导航控制器的引用,因此路由器可以为我们显示,推动,关闭和弹出控制器。 它还支持自定义过渡。

现在,我们的协调器对象具有所需的所有条件,让我们尝试使用它。

实施协调员

在AppDelegate中,我们将初始化Application协调​​器并设置根视图控制器。 应用程序协调器将决定我们应该使用LaunchInstructor对象来进行认证还是主流。 因为这只是概念证明,所以我们不会实现它。 但是,其想法是LaunchInstructor应该检查auth令牌是否可用,如果可用,则注册完成。

启动应用程序时,我们可以登录或注册。 完成后,登录过程Application协调​​器将删除Auth并启动Main协调器。

到目前为止我们得到了什么?

  • 控制器中的代码更少,因为导航逻辑已失效。
  • 控制器不了解其他控制器。

可重用性

正如您在模式中看到的,我们在两个地方都有更改密码协调器。 如果要重用任何流,则需要创建一个选定协调器的新实例,一切准备就绪。

流量变化

产品经理来找你多少次,说一个小小的改变。 我们只需要添加演练和深层链接。 如果问我太多次。 幸运的是,现在这种过渡将不再那么痛苦。

如果要添加演练,则需要创建一个新的协调器并更改LaunchInstructor对象。 我们不需要更改应用程序委托或任何视图控制器中的任何内容。

向项目添加深层链接和推送通知可能非常痛苦。 但是,流量协调器也有解决方案。 启动协调器时,将使用startWithOption并创建新流程或重复使用现有流程。

测试中

现在,我们的控制器和视图模型更加整洁,可重用,并且没有太多依赖项。 因此对我们来说编写测试更容易。 在本文中,我们将不涉及测试,因为这可能是一个全新的话题。

结论

使用流程协调器,我们从视图控制器中删除了导航逻辑。 我们的代码更干净,可重复使用,更易于更改且更易于测试。 起初,它可能会发现有太多的代码要编写。 但是,您可以编写许多代码-BaseCoordinator,Router,LaunchInstructor,您可以在其他项目中重用,因此这是第一次,需要进行大量工作。 有人说这太复杂了,我不这么认为。 即使正确,也可以尝试一下。 它的好处实在不容错过。 这是代码示例。

资源资源

  • 项目实例
  • 使用协调器模式进行自定义过渡
  • 如何使用MVVM和协调器实现委派模式
  • 安德烈·潘诺夫(Andrey Panov)的协调员基本教程
  • Krzysztof Zabtocki关于好的iOS应用程序体系结构的演讲
  • Denis Walsh在iOS中的流程协调器

感谢您阅读🙂

如果本文对您有所帮助,并且您想了解有关类似主题的更多信息,请鼓掌,分享,关注或评论。