从Firebase设置用户值
问题描述:
我试图初始化User
对象中的值,但是从另一个问题看来,它不可能在那里执行 - 现在,试图在视图控制器中执行相同的操作,如viewDidLoad
,I “M运行到另一个错误:从Firebase设置用户值
这是我火力地堡呼叫viewDidLoad
(myUser
是一个全局变量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"
答
由于用户已经签约了,你应该存储密钥的火力用户(例如,通过NSUserDefaults
)引用。在这种情况下,"-KgjW9PEvCPVqzn7T5pZ"
。在userRef中使用它,而不是childByAutoId,它会使用新的密钥生成新的子位置,并且不存在(因此为NSNull
)。
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child("-KgjW9PEvCPVqzn7T5pZ")
良好的捕获,我修正了,但它不影响我得到的错误。 – KingTim