RxFlow第1部分:理论上

RxFlow是基于Reactive Flow Coordinator模式的iOS应用程序导航框架。 该项目是RxSwiftCommunity组织的一部分。

这三篇文章对它的详细概念进行了解释:

  • RxFlow第1部分:理论上
  • RxFlow第2部分:实践中
  • RxFlow第3部分:提示和技巧

这是Github存储库:https://github.com/RxSwiftCommunity/RxFlow

感谢您的反馈,随时可以贡献contribute

我将介绍RxFlow :我的设计框架,在iOS应用程序中实现了Reactive Flow Coordinator。 RxFlowRxSwiftCommunity支持的项目。

关于iOS应用程序中的导航,有两种选择:

  • 使用Apple和Xcode提供的内置机制:Storyboard和Segues
  • 直接在代码中实现自定义机制

这两种解决方案的缺点:

  • 内置机制:导航是相对静态的,并且情节提要非常庞大。 导航代码污染了UIViewControllers
  • 自定义机制:根据所选的设计模式(路由器,协调器),代码可能难以设置并且可能很复杂

RxFlow旨在:

  • 促进将故事板切割成原子单元,以实现协作和UIViewControllers的可重用性
  • 允许根据导航上下文以不同方式呈现UIViewController
  • 简化依赖注入的实现
  • 从UIViewControllers删除任何导航机制
  • 促进反应式编程
  • 在处理大多数导航案例的同时,以声明的方式表示导航
  • 促进将应用程序切成逻辑导航块

从情节提要到协调器模式

随着我作为iOS开发人员(以及Android或Web应用程序开发人员)的经验的增长,我一直面临着有关导航的同样疑问。 对于所有其他概念问题,有很多模式可以解决常见的体系结构问题和关注点需求分离(MVC,MVP,MVVM,VIPER等)。

但是,一旦设计导航,我就被撕碎了:

  • 如何在Storyboard / Segues中使用依赖项注入?
  • 如何控制应用程序的流程?
  • 如何摆脱UIViewControllers中的导航样板代码?

随着时间的流逝,我对iOS应用程序的构想从带有一个Storyboard的MVC到带有多个Storyboard的MVC,最终达到了我们可以称为当今最佳实践之一:带有Flow Coordinator的 MVVM。 这非常好,因为我们可以玩依赖注入,UIViewControllers可重用性和可测试性。 我有机会将这种模式应用于生产中的大型复杂应用程序。 但是最后,仍然有一些问题困扰着我:

  • 我总是不得不一次又一次地编写协调器模式,
  • 有很多委派模式用于允许ViewModel与协调器进行回通讯。
  • 我开始研究Redux模式,尤其是导航状态机制。 我们可能有一个全局导航状态,该状态通过RxSwift Observables公开,并且有人在监听此状态并驱动导航。 我发现唯一令人不安的是这种导航状态的独特性以及它可能具有的不受控制的责任(以及它可以存储的海量数据)

导航只是一种状态的反射,这种状态可以逐步修改的想法开始出现。 一种状态,将散布在整个应用程序结构中,而不是存储在单个位置中,而是由观察者统一起来,可以对它作出反应并因此驱动导航。 在本文的后面,这些散布在应用程序中的小状态称为“ 步骤” ,而观察者称为“ 协调器”

RxFlow是从所有经验中诞生的,解决了传统中仍然存在的两个主要问题。 协调器模式:

  • 开发人员不必再编写协调员,他只需要声明导航及其所针对的状态,
  • 不再需要委托,因为状态是织机观察到的RxSwift Observable

关键原则

要了解有关Coordinator模式的更多信息,建议您看一下这篇文章:Coordinator Redux。

尽管这是一个非常好的架构,但是Coordinator模式也有一些缺点:

  • 您每次引导应用程序时都必须编写协调机制
  • 由于可以与协调员进行通信的委托模式,因此可能会有很多样板代码

RxFlow是协调器模式的反应式实现。 它具有此体系结构的所有重要功能,但进行了一些改进:

  • 使导航更具声明性
  • 提供一个内置的协调器,用于处理您声明的导航流
  • 使用反应式编程来解决与协调员的沟通问题

您必须熟悉以下6个术语才能理解RxFlow:

  • Flow :每个Flow都定义了应用程序中的导航区域。 在此声明导航动作(例如,呈现UIViewController或其他Flow)
  • 步骤 :每个步骤都是应用程序中的导航状态。 流程和步骤的组合描述了所有可能的导航操作。 步骤甚至可以嵌入内部值(例如ID,URL等),这些内部值将传播到流程中声明的屏幕中
  • 步进器 :可以是任何可以发出步进的东西。 步进器将负责触发流中的每个导航动作
  • 可表示的 :它是可以表示的东西的抽象(基本上UIViewController和Flow是可表示的)。 演示文稿提供了协调者将订阅的Reactive Observable,以便以符合UIKit的方式处理流程步骤
  • Flowable :这是一个简单的数据结构,结合了Presentable和stepper。 它告诉协调员下一步将发生什么,这将在您的响应式机制中产生新的步骤
  • 协调器 :一旦开发人员定义了代表导航可能性的流程和步骤的适当组合,协调器的工作就是以一致的方式混合这些组合。

本文仅讨论此框架的概念和理论方面。 我建议您阅读以下两篇文章,以更熟练地了解代码示例:

  • RxFlow第2部分:实践中
  • RxFlow第3部分:提示和技巧

您可以浏览RxFlow的GitHub 存储库 ,其中包括一个演示应用程序:https://github.com/RxSwiftCommunity/RxFlow。

感谢您的时间和反馈feedback