Firebase观察封包未称为[重复]

问题描述 投票:0回答:1
运行Firebase关闭程序,例如:

databaseRef.observe(.childAdded) { (snapshot) in ... }

第一次运行时,它将去获取数据,并在添加数据时也将执行其关闭。这是应该的。但是,当您首次触发此方法并且没有要获取的数据时,闭包永远不会返回。这样就无法判断是否没有数据,或者是否还没有获得所有数据。没有闭包触发,我们就无法查看snapshot以查看是否为exists

鉴于文档表明您可以查询快照以查看快照是否存在或值是否为nil,因此必须有一种方法可以首先调用该快照。再次添加的后续数据将调用此关闭,如果最初有数据,则关闭将返回。

如果没有数据,如何获得初始回调会丢失什么?

更新:

提供一个工作解决方案,该解决方案在给出的链接中未提供,表明这是重复的。这个问题的原因-Frank在这里和他提供的线程链接中都做了完美的回答-是由于.childAdded的工作方式。弗兰克(Frank)表示,可以在同一查询上同时调用.value.childAdded,并且不会两次加载初始数据。基于此关键信息,我开始通过以下方式进行处理:

databaseRef.observeSingleEvent(.value, with: { (valueSnapshot) in if !valueSnapshot.exists() { [do stuff based on the absence of data] } databaseRef.observe(.childAdded) { (childSnapshot) in [do stuff based on children present and when children added] } }

外部事件只会触发一次。内部事件将设置为侦听器,因此将来添加的子代将仅在其闭包内执行。     
swift firebase firebase-realtime-database
1个回答
1
投票
A .childAdded事件。如果存在子节点,则不会触发.childAdded

如果您想知道数据是否存在,则应该观察.value事件。

如果您在同一引用/查询中同时观察到.child....value,则Firebase只会检索一次数据。因此,无需进行额外的数据传输即可观察这两个事件。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.