如何使Firebase子快照值恢复正常工作?

时间:2018-12-05 19:21:29

标签: swift firebase firebase-realtime-database nsstring nsnull

var test = String()

func fetchUser() {
 let currentUserUid = Auth.auth().currentUser?.uid

    Database.database().reference().child("users").child(currentUserUid!).child("test").observeSingleEvent(of: .value) { (snapshot) in

        self.test = snapshot.value as! String
   })   
}     

我想将快照值添加到变量中。

但是它崩溃了,尽管我的firebase概念是完美的并且适合代码。

可能是什么原因?

控制台结构:

  • 用户
    • iBagi96IMGbd2k6wUtXjPs0gmNq1。 <--- currentUserUid
      • 测试:testValue

我得到的错误:无法将类型'NSNull'(0x10dd86de0)的值强制转换为'NSString'(0x10b2485d8)。

此外,我想补充一点,我曾经将子名称从“ test”重命名为其他名称,此后不久便工作了。然后再次发生错误。

1 个答案:

答案 0 :(得分:2)

问题代码中有很多错别字,但这是正确的。

最大的问题是可选对象的处理-当您应将它们视为可选对象以保护代码时,它们被强制展开。

所以这个

let currentUserUid = Auth.auth().currentUser?.uid

会更好

guard let user = Auth.auth().currentUser else {return}
let uid = user.uid

但是使用您的代码,这是一个更新,它从该节点以字符串形式读取值并打印出来。

var test = String()

func readUserString() {
    let currentUserUid = "iBagi96IMGbd2k6wUtXjPs0gmNq1"
    let usersRef = self.ref.child("users")
    usersRef.child(currentUserUid).child("test").observeSingleEvent(of: .value, with: { snapshot in
        let test = snapshot.value as! String
        print(test) //prints "testValue"
    })
}