Firebase如何检查快照的子代本身是否为Datasnapshot类型

时间:2019-09-14 17:26:35

标签: ios swift firebase firebase-realtime-database

我如何检查子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 ),由于有子级,所以达到了print语句,但它们只是字典值。我想要它,以至于无法实现它,因为它下面没有任何Datasnapshots。

例如1 属于dict值且没有数据快照的子项

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

仅当有像这样的数据快照时,才可以到达打印语句。 2 下方

例如2 个是dict值的孩子和2个Datasnapshot

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

1 个答案:

答案 0 :(得分:0)

您使用的定义稍有偏差,这使其难以实现。

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

假设您的数据库中有此JSON:

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

如果将此JSON从数据库加载到应用程序中,则将获得一个具有密钥-LojqctqkDpthbF_TYvP的单个顶级快照。此快照有三个子快照,每个子快照一个。这些键中的每个键的值都是原始字符串值的事实并不重要:它们仍然是每个DataSnapshot。因此,在上面的JSON中,有四个快照,分别具有键-LojqctqkDpthbF_TYvPkey1key2key3


区别在于子DataSnapshot的值的类型。因此,如果您想知道他对某个特定DataSnapshot的值本身是否又是复杂类型,则可以对每个子快照进行

snapshot?.value is Dictionary

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

snapshot?.hasChildren()

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