【问题标题】:Swift & Firestore - check for document in collection always returns falseSwift & Firestore - 检查集合中的文档总是返回 false
【发布时间】:2020-07-30 01:15:33
【问题描述】:

所以,这是我的代码,它非常简单...只是尝试检查具有特定名称的文档是否存在于我的 firestore 集合中并返回一个布尔值作为其状态:

 func checkSessionCode(_ code: String) -> Bool {
        print("checkSessionCode running")
        var doesCodeExist = false
        
        
        let docRef = env.db.collection(K.sessions).document(code)
        docRef.getDocument { (document, error) in
            if document!.exists {
                print("Document data: \(document!.data())")
                doesCodeExist = true
              } else {
                 print("Document does not exist")
                doesCodeExist = false
              }
        }
        
        print("doesCodeExist == \(doesCodeExist)")
        return doesCodeExist
    }

长话短说,无论我的输入代码是什么(如果它与文档匹配),它总是返回 false。此外,对于它的价值,在控制台中 print("doesCodeExist == (doesCodeExist)") 输出总是在 print("Document data: (document!.data())") 之前打印...有什么关于这个闭包是在它完成检查服务器之前返回值吗?

另外,我的文档非常轻量级,所以检查速度很快(显然不够快)...

【问题讨论】:

  • "...这个闭包在完成检查服务器之前是否返回了值?"关闭不返回任何东西。它通过副作用而不是返回来设置值doesCodeExist。您看到的是副作用不会及时发生,因为它是异步运行的。搜索“return from async swift”,你会看到这个问题已经被问了几千次了

标签: swift google-cloud-firestore


【解决方案1】:

这个闭包是否在完成检查服务器之前返回了值?

是的,闭包是异步执行的,不是立即执行的。 getDocument 不会阻塞代码,它会在查询完成之前立即返回。稍后将调用回调并显示结果。这是为了避免让您的代码阻塞 UI 线程,这会导致您的应用在查询期间变得无响应。阅读有关why the Firebase APIs are asynchronous 的更多信息。

正如您现在编写的那样,该函数将始终返回 false,因为 doesCodeExist 的初始值在其值返回时不会改变。

【讨论】:

  • 这可能是我将得到的最佳答案...我将“doesCodeExists”值移至我的 swiftui 项目的可观察对象,然后让此函数设置该值,因为切换正在切换项目中的显示。所以,虽然我无法让上述工作,但我找到了一种解决方法并在此过程中学到了一些东西......再次感谢!
猜你喜欢
  • 1970-01-01
  • 2017-08-02
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2021-06-24
相关资源
最近更新 更多