【问题标题】:Alternatives to completion handlers in Swift with Firestore在 Swift 中使用 Firestore 替代完成处理程序
【发布时间】:2019-12-31 04:44:09
【问题描述】:

我正在尝试为我的 iOS 应用实现 3 层架构,并且我正在尝试让它与 Firestore 调用一起使用。

所以在这个应用程序中,我的控制器调用我的服务,该服务又调用存储库,然后直接调用 Firebase。代码示例如下:

import Firebase

let db = Firestore.firestore()

func repositoryLoad (completion: @escaping ((DocumentSnapshot?, Error?)) -> Void) {
     db.collection("users").document().getDocument { (document, error) in
        completion((document, error))
    }
}

func serviceLoad (completion: @escaping ((DocumentSnapshot?, Error?)) -> Void) {
    repositoryLoad { (document, error) in
        completion((document, error))
    }
}

func controllerLoad (completion: @escaping ((DocumentSnapshot?, Error?)) -> Void) {
    serviceLoad { (document, error) in
        completion((document, error))
    }
}

如您所见,通过层调用来自 firebase 的信息会使语法相当麻烦,因此突出了我需要更“优雅”的解决方案。

因此,我的问题是,如果我在存储库级别调用 Firestore,是否意味着我必须在服务和控制器的函数中实现完成处理程序?如果是这样,是否有任何替代方案,我可以使用任何库?如果没有,我应该怎么做?

顺便说一句,我正在研究 C#/JS 中的 async/await(我理解为将异步调用的结果处理为已评估的结果)之类的功能,我发现了诸如 DispatchGroup 和 DispatchSemaphore 之类的东西,不幸的是没有为我工作。从那时起,我发现这些概念处理的是多线程,而不是像完成处理程序那样处理异步结果(这是我想要的)的问题。但是,如果我有任何错误,请纠正我!

我对使用异步代码感到很困惑,因此非常感谢任何帮助。提前致谢!

【问题讨论】:

  • 你想通过实现一个完成处理程序来实现什么?
  • 基本上用从 Firestore 中提取的信息来做事!
  • 您介意发布一些代码以便于理解您的问题吗?
  • Firestore 中的数据确实仅在回调/闭包/完成处理程序中可用。如果您在完成这项工作时遇到问题,请编辑您的问题,以包含显示您正在尝试做什么以及您卡在哪里的最少代码。

标签: ios swift multithreading asynchronous google-cloud-firestore


【解决方案1】:

RxSwift 是 swift 中的反应式编程框架。这可能是处理异步调用的最佳解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多