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