首页 > 解决方案 > Firebase如何检查快照的孩子本身是否属于Datasnapshot类型

问题描述

我如何检查孩子LojqctqkDpthbF_TYvP是否有其他孩子,Datasnapshot而不是k/v像在例如。1 ?

我尝试了所有这些但都没有奏效:

Database.database().reference().child("LojqctqkDpthbF_TYvP").observeSingleEvent(of: .value, with: { (snapshot) in

    if !snapshot.hasChildren() { return }

    guard snapshot.children.allObjects is [DataSnapshot] else { return }

    guard let children = snapshot.children.allObjects as? [DataSnapshot] else { return }

    print("this print statement should only get reached if there are Datasnapshots underneath of it")

})

在上面的代码中(来自下面的示例1),由于有子项,但它们只是 dict 值,因此到达了 print 语句。我想要它,因为它下面没有任何Datasnapshots,所以它不会被专门访问。

例如。1是 dict 值且没有 Datasnapshots 的子项

-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"

只有在有数据快照的情况下才能到达打印语句,例如。2以下

例如。2 个作为 dict 值的子项和 2 个数据快照

-LojqctqkDpthbF_TYvP
  |
  |---"key1":"value1"
  |---"key2":"value2"
  |---"key3":"value3"
  |
  @-LlzB3_ppHHVmdipXs
  |     
  @-LlzD8p5-WOT-ZZhfc

标签: iosswiftfirebasefirebase-realtime-database

解决方案


您正在使用稍微偏离的定义,这使得它难以实现。

让我们首先正确定义数据库中的哪些数据在DataSnapshot客户端中变为a:

假设您在数据库中有这个 JSON:

"-LojqctqkDpthbF_TYvP": {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

如果您将此 JSON 从数据库加载到应用程序中,您将获得一个带有 key 的顶级快照-LojqctqkDpthbF_TYvP。此快照具有三个子快照,每个子快照对应其下的每个键。这些键中的每一个的值都是原始字符串值这一事实并不重要:它们仍然是每个 a DataSnapshot。所以在上面的 JSON 中有四个快照,键-LojqctqkDpthbF_TYvP为 、key1key2key3


区别在于 childDataSnapshot的值的类型。因此,如果您想知道某个DataSnapshot值本身是否又是一个复杂类型,您可以为每个子快照执行类似操作:

snapshot?.value is Dictionary

或者,您可以检查每个子快照是否有子快照:

snapshot?.hasChildren()

对于-LojqctqkDpthbF_TYvP上述测试,它们都将为真,而对于其他键,它们将为假。


推荐阅读