我正在尝试编写一个代码,用于从实时数据库中提取数据,使用observe更改子项。但我不知道错误是什么,但代码失败了。从我的调试研究中,我发现当值改变时成功触发了观察,但是当我尝试将快照值变为变量时它失败了。如何在观察儿童变化案例中检索数据。
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
答案 0 :(得分:2)
谢谢你们,我找到了答案,可能会帮助别人。我被放下了有效的新代码。
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中更改多个值,则observe会将其检测为多个更改,一个每一个变化为一个值的变化。因此,当我将其更改为直接字符串时,它工作。你是对的@Achref Gassoumi问题与演员有关。就在你讲完之后,我试了一下。感谢。
答案 1 :(得分:0)
我认为你的问题可能与演员有关 尝试以下方法:
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)