从Firebase设置用户值

问题描述:

我试图初始化User对象中的值,但是从另一个问题看来,它不可能在那里执行 - 现在,试图在视图控制器中执行相同的操作,如viewDidLoad,I “M运行到另一个错误:从Firebase设置用户值

这是我火力地堡呼叫viewDidLoadmyUser是一个全局变量var myUser:User!):

 let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").childByAutoId() 
     let userRefHandle: FIRDatabaseHandle? 

     userRefHandle = userRef.observe(.value, with: { (snapshot) -> Void in 
      let userData = snapshot.value as! Dictionary<String, AnyObject> 
      let id = snapshot.key 

      if (FIRAuth.auth()?.currentUser?.uid) != nil { 
       if let name = userData["name"] as! String!, name.characters.count > 0 { 
        let handle = userData["handle"] as! String! 
        let gender = userData["gender"] as! String! 
        let profilePicture = userData["profilePicture"] as! String! 
        let uid = userData["uid"] as! String! 
        // let rooms = userData["rooms"] as! [[String : AnyObject]] 

        myUser.uid = uid 
        myUser.uid = handle 
        myUser.uid = name 
        myUser.uid = profilePicture 
        myUser.uid = gender 
//      myUser.rooms = rooms 

       } else { 
        print("Error! Could not initialize User data from Firebase") 
       } 
      } 
     }) 

这样做的最终目标是,这样当用户启动应用程序(已经注册并且他们的信息在Firebase中),他们的i nfo从数据库中提取并设置为User对象,以便可以在应用程序(名称,句柄,profilePicture等)周围使用这些值。

我收到错误:Could not cast value of type 'NSNull' (0x106d378c8) to 'NSDictionary'let userData = snapshot.value行。

这是用户的数据看起来像在火力地堡什么:

"users" : { 
    "-KgjW9PEvCPVqzn7T5pZ" : { 
     "gender" : "male", 
     "handle" : "TestHandle123", 
     "name" : "Timothy", 
     "profilePicture" : "https://graph.facebook.com/*removed*/picture?type=large&return_ssl_resources=1", 
     "uid" : "2q4VCKu1e7hiL84ObdzgQcQ0pH63" 
    } 
} 

我想知道如果这是设置从火力地堡用户价值的正确方法,如果是的话,如何避免错误?

在你的代码

,你正在寻找使用profile

let profilePicture = userData["profile"] as! String! 

的资料图片,但在数据中,你有profilePicture

因为你已经*解包,你会得到这个错误,当钥匙未找到。

你应该确保你在两个地方使用相同的密钥。这也可能是值得包括在默认的情况下,你曾经有数据问题

let profilePicture = userData["profile"] as? String ?? "default" 
+0

良好的捕获,我修正了,但它不影响我得到的错误。 – KingTim

由于用户已经签约了,你应该存储密钥的火力用户(例如,通过NSUserDefaults)引用。在这种情况下,"-KgjW9PEvCPVqzn7T5pZ"。在userRef中使用它,而不是childByAutoId,它会使用新的密钥生成新的子位置,并且不存在(因此为NSNull)。

let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child("-KgjW9PEvCPVqzn7T5pZ")