iOS:RxSwift +干净的架构

在上一篇文章中,我们有机会从概念上定义应用程序的体系结构。 这篇文章的目的是深入了解我们正在使用的该体系结构的关键组件的实现。

在这篇文章中,我们将讨论如何实现:

RxSwift +干净的架构

我们的应用程序使用ReactiveX swift版本:RxSwift。 RxSwift是组合异步操作和事件/数据流的强大工具。 这些流使层之间的通信变得容易。 这就是为什么我们认为它完全适合我们的架构需求。

该方案表示RxSwift流经体系结构不同层的方式:

基本上,Presenter执行返回一个Observable的用例。 此Observable在数据层上创建,并由域层传递。 演示者订阅此Observable来从存储库中获取结果。

但是,什么是可观察的?

如果我们阅读RxSwift的入门文档,我们可以理解什么是Observable:

每个Observable序列只是一个序列。 Observable vs Swift的Sequence的主要优点是它还可以异步接收元素。 这是RxSwift的内核。

让我们逐层介绍实现:

实作

  • UI层

演示者有一个要执行的用例。 方法execute返回一个Observable。 演示者订阅了此Observable:

请注意,在订阅关闭之后,我们将调用disposed(by: disposeBag) 。 此方法将订阅添加到disposeBag中以取消该订阅。 最后,在闭包内部使用[unowned self][weak self]并使用dispose(by:)方法可以避免内存泄漏。 😉

  • 域层

用例具有一个execute方法,该方法调用CatalogRepository协议方法并返回由该存储库创建的Observable:

  • 资料层

数据存储库实现在域层中定义的CatalogRepository协议,并具有数据源和数组。 这些数据源又实现了CatalogDataSource协议。 在数据存储库的每个方法内部,它为包含的每个数据源从CatalogDataSource调用一个函数。 为了连接这些调用,我们使用Observable的操作concat ,如下所示:

远程数据源创建一个Observable并使用Alamofire执行请求。 响应结果将通过Observable onNext()onCompleted()onError()方法发送给演示者。

就这样! 通过层连接完成! ✅

这可能是每个人的应用程序中的常见情况,但是RxSwift是一个功能强大的工具,这只是冰山一角。

让我们深入了解我们在项目中使用更多的东西之一:

经营者

RxSwift中有许多运算符:创建,转换,过滤,合并……可以使您的生活更轻松。 在这里您可以找到列表。 如果您需要操作员并且不知道如何找到它,则可以使用操作员的决策树。 还有一个大理石图,用于查看操作员的工作方式:RxMarbles。

在本文中,我们已经看到了concat操作,但是我们将详细介绍我们使用最多的其他运算符。

  • 压缩

我们使用此运算符来获取多个Observable的结果并对其结果进行操作。

  • flatMap

这个操作员挽救了我们的生命。 need当需要连接多个Obsevable时,可以使用此运算符,但是执行下一个Observable时需要前一个Observable的结果。

  • 公正/错误

我们使用这些运算符根据需要返回特定的可观察类型。 在下面的示例中,我们将两者同时使用。

  • 从/过滤器/排序/地图/采取/ toArray

从Realm获取数据时,我们将使用所有这些运算符。 在以下示例中,我们可以看到组合时Observables运算符的功能如何。 ✨

您也可以创建自定义运算符。

希望您发现这篇文章有趣并且对您的项目有用。 任何问题或评论都将受到欢迎!

谢谢,祝你好运!

相关文章

在以下文章中,我们详细介绍了架构中的其他关键组件:

  • Tiendeo应用程序中的MVP清洁架构
  • 依赖注入
  • 储存库模式