【问题标题】:Firebase datadescription returns empty arrayFirebase 数据描述返回空数组
【发布时间】:2019-10-11 06:30:36
【问题描述】:

我正在尝试从 1 个文档中将所有字段作为字典抓取。但是当我尝试这样做时,我只会返回空数组。我尝试从文档中获取帮助,但它不起作用。

这行代码显示它不是空的

print("缓存的文档数据:(dataDescription)")

var user:String = (Auth.auth().currentUser?.email)! // I used email as name of document.

var Groups = [String:Any]()

    let docRef = AppDelegate.db.collection("JoinedGroups").document(user)

    docRef.getDocument(source: .cache) { (document, error) in
        if let document = document {
            let dataDescription = document.data()
            self.Groups = dataDescription!   // unwrapping here
            print("Cached document data: \(dataDescription)")
        } else {
            print("Document does not exist in cache")
        }
    }
    // Do any additional setup after loading the view.
    print(Groups)

}

这是我的结果: 当我将鼠标悬停在定义上时,document.data() 显示为字典

[:] //显示为空??

缓存文档数据:可选(["test new": test new, "g3": g3, "g1": g1])

如果我能在这个问题上得到一些帮助,非常感谢。

【问题讨论】:

  • 仅供参考,您可以使用编辑链接编辑您的问题,而不是在评论中添加新信息。

标签: swift firebase google-cloud-firestore


【解决方案1】:

这里的主要问题是 FireStore 是异步的。 Firestore 从 Internet 返回数据需要时间,并且该数据仅在 getDocument 之后的闭包内部有效。

这意味着 print(Groups) 函数将在闭包内的代码之前执行,因此它是空的。将打印件移入封闭件内即可。

var Groups = [String:Any]()
    let docRef = AppDelegate.db.collection("JoinedGroups").document(user)
    docRef.getDocument(source: .cache) { (document, error) in
        if let document = document {
            let dataDescription = document.data()
            self.Groups = dataDescription!   // unwrapping here
            print("Cached document data: \(dataDescription)")
        } else {
            print("Document does not exist in cache")
        }
        print(self.Groups)
    } 
}

我还建议您坚持使用 var 为小写的命名约定,例如组而不是组。大写通常用于类定义 UserClass 或 GroupClass。

最后一件事... documentID(它们的“键”)不能更改。这意味着如果你的结构是这样的

JoinedGroups
   jimmy@email.com
      name: "Jimmy"
      fav_food: "Pizza"

并且您在整个应用程序中引用该用户,当他们决定更改其电子邮件提供商时,您必须遍历结构中的所有位置,读取该节点,删除该节点并使用更新的电子邮件将其写回.您如何解决它是将 documentID(键)与其包含的数据分离

JoinedGroups
   users_uid
      name: "Jimmy"
      fav_food: "Pizza"

由于 uid 永远不会改变,因此电子邮件可以更改 20 次而不会影响您的应用。

【讨论】:

  • 非常感谢。我感谢您的帮助。我会考虑你提到的。
  • @Kenny 如果我的回答有帮助,请务必接受它,以便它可以帮助其他人。见How To Accept
  • 我有一个问题,如果数据仅在 getDocument 关闭时有效。我怎样才能把数据拿出来?我想要来自字段的值。有没有别的办法。
  • @Kenny 有很多选项,但关键是让闭包控制应用程序的流程。换句话说,不要尝试在闭包外部填充tableView dataSource,当数据有效时将其填充在闭包内。无论如何,tableView 数据源通常是一个类 var,因此该模型运行良好。关于使用 Firestore 的流程,这里有 很多 个示例 - 也许您可以找到一个与您的用例匹配的示例,如果没有,请提出另一个问题,我们会看看!跨度>
猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多