【问题标题】:Firebase Observe Closure Not Called [duplicate]未调用 Firebase 观察关闭 [重复]
【发布时间】:2020-09-26 21:53:12
【问题描述】:

运行 Firebase 闭包,例如:

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

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

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

如果没有数据,我在获取初始回调时缺少什么?

更新:

提供一个有效的解决方案,该解决方案未在给出的链接中提供,表明这是重复的。这个问题的原因——弗兰克在这里和他提供的线程链接中完美地回答了——是由于.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】:

    .childAdded 事件会针对最初存在或稍后添加的每个子节点触发。如果有子节点,.childAdded 不会被触发。

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

    如果您在同一引用/查询中同时观察到 .child... 和 .value,则 Firebase 只会检索一次数据。所以没有额外的数据传输来观察这两个事件。

    另见:

    【讨论】:

    • 您在上面指出的关键是您可以在同一引用上观察 .child 和 .value ,而无需多次检索数据。在这种情况下,第一个查询是否会基于.value 使用observeSingleEvent,而第二个查询将是常规的孩子观察?我问是因为我不希望基于 .value 进行持续观察,而您提供的链接中没有解决这个问题。谢谢。
    • 如果您只关心正在完成的初始数据,observeSingleEvent 或 .value 确实有意义。
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2019-02-04
    • 2017-12-28
    • 1970-01-01
    • 2012-06-05
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多