2017-04-06 68 views
0

我試圖初始化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" 
    } 
} 

我想知道如果這是設置從火力地堡用戶價值的正確方法,如果是的話,如何避免錯誤?

在你的代碼

回答

0

,你正在尋找使用profile

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

的資料圖片,但在數據中,你有profilePicture

因爲你已經被迫解包,你會得到這個錯誤,當鑰匙未找到。

你應該確保你在兩個地方使用相同的密鑰。這也可能是值得包括在默認的情況下,你曾經有數據問題

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

良好的捕獲,我修正了,但它不影響我得到的錯誤。 – KingTim

0

由於用戶已經簽約了,你應該存儲密鑰的火力用戶(例如,通過NSUserDefaults)引用。在這種情況下,"-KgjW9PEvCPVqzn7T5pZ"。在userRef中使用它,而不是childByAutoId,它會使用新的密鑰生成新的子位置,並且不存在(因此爲NSNull)。

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