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

时间:2017-04-21 07:54:16

标签: swift firebase firebase-realtime-database

我正在尝试编写一个代码,用于从实时数据库中提取数据,使用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

2 个答案:

答案 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)