如何使用观察者在Firebase实时数据库中检索儿童中的密钥值更改



我试图使用"观察儿童更改"来编写代码以从实时数据库中获取数据。但是我不知道错误是什么,但是代码失败了。从我的调试研究中,我发现该值在变化时成功触发了观测,但是当我尝试将快照值获取到变量时,它会失败。在观察儿童变化案例中应该如何检索数据。

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 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
  }
})  }

问题在于,观察者将数据库中的更改视为一个一个,因此该快照是每个更改的单个数据,如果您在GO中更改多个值,则观察将其检测为多个更改,一个每次更改为一个值的更改。因此,当我将其更改为直接字符串时,它起作用了。您是对的@achref gassoumi。就在您告诉它之后,我尝试了一下。谢谢。

我认为您的问题可能与演员尝试以下内容:

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)

最新更新