Swift 3,保持领域不受appdelegate

时间:2017-09-18 17:53:56

标签: ios swift realm viper-architecture

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

我怎么能很好地解决这个问题?我考虑过以下几种选择:

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

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

1 个答案:

答案 0 :(得分:0)

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