Swift 如何使用observe在firebase实时数据库中检索子项中更改的键的值

Swift 如何使用observe在firebase实时数据库中检索子项中更改的键的值,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我试图编写一个代码,使用observe for child changed从实时数据库中提取数据。但我不知道是什么错误,但代码失败了。从我的调试研究中,我发现当值更改时,观察成功触发,但当我尝试将快照值获取到变量时,观察失败。在观察子变更案例中,应如何检索数据 func userBalance() { DatabaseProvider.Instance.userRef.child(UserDataHandler.Instance.user_id).observe(FIRDataEventType

我试图编写一个代码,使用observe for child changed从实时数据库中提取数据。但我不知道是什么错误,但代码失败了。从我的调试研究中,我发现当值更改时,观察成功触发,但当我尝试将快照值获取到变量时,观察失败。在观察子变更案例中,应如何检索数据

func userBalance() {
DatabaseProvider.Instance.userRef.child(UserDataHandler.Instance.user_id).observe(FIRDataEventType.childChanged, with: { (snapshot) in
  print("Snapshot: ", snapshot)
  print("Snapshot Value", snapshot.value)
  guard let data = snapshot.value as? NSDictionary else {
    print("checkpoint fail test")
    return
  }
  guard let userBalance = data[Constants.BALANCE] as? String else { return }

  // update UserDefaults
  userDefault.setString(userBalance, forKey: "userBalance")

  //update local session
  UserDataHandler.Instance.balance = userBalance

})   }
请帮助我,提前谢谢

Debugging Data :
Snapshot:  Snap (balance) 100
Snapshot Value Optional(100)
checkpoint fail test

我想你的问题可能是演员的问题 请尝试以下操作:

DatabaseProvider.Instance.userRef.child(UserDataHandler.Instance.user_id).observe(FIRDataEventType.childChanged, with: { (snapshot) in

  guard let data = snapshot.value as? [<String,anyObject>] else {
    print("checkpoint fail test")
    return
  }
print (data)
DatabaseProvider.Instance.userRef.child(UserDataHandler.Instance.user_id).observe(FIRDataEventType.childChanged,其中:{(快照)在
guard let data=snapshot.value为?[]其他{
打印(“检查点失败测试”)
返回
}
打印(数据)

谢谢大家,我找到了答案,也许它会帮助其他人。我记下了新的有效代码

DatabaseProvider.Instance.userRef.child(UserDataHandler.Instance.user_id).observe(FIRDataEventType.childChanged, with: { (snapshot) in
  guard let key = snapshot.key as? String else { return }
  guard let value = snapshot.value as? String else { return }

  if key == Constants.BALANCE {
    guard let userBalance = value as? String else { return }

    // update UserDefaults
    userDefault.setString(userBalance, forKey: "userBalance")

    //update local session
    UserDataHandler.Instance.balance = userBalance

  }
})  }

问题是,observe会逐个检测数据库中的更改,因此每次更改的快照都是一个数据,如果您在一次操作中更改多个值,observe会将其检测为多个更改,每次更改都是一个值的更改。因此,当我将其更改为direct string时,它起到了作用。您是对的@AchrefGassoumi问题出在演员身上。就在你告诉我这件事之后,我试过了。谢谢。

嗨,如果有人能在我错过或出错的地方帮助我,那将是非常有帮助的。嗨,首先感谢你试着帮我。所以在你说了之后,我用AnyObject试过了,但我收到错误消息“键入AnyObject不符合专业标准。”tocol Hashable'。它不允许生成项目。错误是因为键不能是anyObject类型,我修改了答案:键应该是字符串