1

我正在我的应用程序中使用 VIPER 架构,现在我想使用我的领域数据库。但是,通常我会把它放在 中AppDelegate,如果我想在 中使用它ListInteractor,我需import UIKit要这样做是违反 VIPER 规则的。

我怎样才能很好地解决这个问题?我考虑了以下选项:

  • 创建服务
  • 单例解决方案
  • 但是,仅import RealmSwift在交互器中使用,我将失去简单的迁移功能。

我确实希望能够使迁移以及其他配置尽可能简单。

4

1 回答 1

0
  • 您将完全在 Interactor 区域内使用 Realm API(没有 UIKit 的 AppDelegate)。然后,Realm 异步操作的完成将转换为您自己的应用程序域表示,甚至可能是实体区域中的(新?)实体。无论如何,VIPER 中的所有区域间消息传递都是通过应用程序域构造,而不是 Realm 构造,也不是 Apple-OS-framework 构造。
  • 您将选择一个区域间效果框架,它是您指定的应用程序域反应方式来表示效果流。在 Swift 中,两个最有可能的选择是:RxSwift 或 Apple 的 Combine(或者甚至是 OpenCombine,如果它足够成熟来支持您的需求)。还有一些其他的选择(ReactiveSwift,滚动你自己的),但需要准确地知道为什么那个人选择哪一个。尽管您可能会偷看 RxCocoa 的实现来乞求、借用、滑动和模仿想法,但您将严格避免在视图、交互器、演示者和路由器区域之间使用任何 RxCocoa 本身的跨区域。您将设计自己的应用程序域使用 RxSwift(在某种程度上类似于 RxCocoa 将 Apple 框架改编为 RxSwift),而 RxCocoa 不会将任何 Apple-OS-framework 结构泄漏到区域间反应性效果流消息传递中。
  • 然后,视图、交互器、演示者和路由器区域之间的所有区域间消息传递都是通过您选择的效果流框架使用您的应用程序域表示正在发生的事件(不参考领域或 Apple-OS 框架/结构/概念)在穿越 VIPER 区域边界时。这种为即将到来的未来可交换性而隔离的区域内使得 VIPER 成为一个干净的架构,因此可以抛弃 Realm(在您的应用程序的某些端口到不同的环境或有朝一日更好地替换 Realm)并且 iOS 框架可以被抛弃(有一天在你的应用程序的某些 MacOS 端口中,反之亦然,甚至有一天在你的应用程序的某些 Android 或 UWP 端口中)。
  • 通过在以应用程序域为中心的跨区域消息传递中依赖指定的反应式效果流库/框架,您将不会像在 OP 中那样将 UIKit 的 AppDeleglate 用于任何区域间消息传递。这个答案实际上彻底解释了“创建服务”的反应性解释会是什么样子。
于 2021-04-17T18:45:51.723 回答