編輯,在底部更新,僅檢索當前用戶的子值仍然有問題從火力地堡
我已經存儲了我的用戶在火力地堡這樣的 - 每個用戶的值存儲它們的UID下(FIRAuth.auth()?.currentUser?.uid
):
"users" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : {
"gender" : "male",
"handle" : "TestHandle2",
"name" : "Timothy",
"profilePicture" : "https://graph.facebook.com/*removed*/picture?type=large&return_ssl_resources=1"
}
}
我們獲得用戶的信息(將其設置爲我User
對象周圍的應用程序中使用),我有這樣的功能:
func getUserInfo() {
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users")
// How to get specific user (current user only)??
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
let users = snapshot.value as! [String: Dictionary<String, String>]
for (key, value) in users {
guard let name = value["name"] else {print("Error getting user name"); return}
guard let handle = value["handle"] else {print("Error getting user handle"); return}
guard let gender = value["gender"] else {print("Error getting user gender"); return}
guard let profilePicture = value["profilePicture"] else {print("Error getting user profilePicture"); return}
print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
})
}
但是,這會返回數據庫中所有用戶的值 - 我只想獲取當前用戶的值。
我可以添加/更改此功能以確保它僅檢索當前用戶的值,而不是所有用戶?另外(如果有必要,我可以提出一個單獨的問題,但這似乎與此有關),這種將每個用戶的值存儲爲其UID子項的結構是一種很好的方法嗎?我注意到其他示例中的很多時間都是以childByAutoId
存儲的。我不確定會有什麼優勢。
感謝您的幫助!
編輯:
如果我添加另一個孩子(UID)的參考結束再投作爲[String : AnyObject]
字典,我可以得到當前用戶的價值,但解析它似乎是一個問題。
func getUserInfo() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid)
self.currentUser?.uid = uid
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
if let usersDict = snapshot.value as? [String : AnyObject] {
print(usersDict)
for user in usersDict {
// guard let name = user.value(forKey: "name") else {print("Error getting user name"); return}
// guard let handle = user.value(forKey: "handle") else {print("Error getting user handle"); return}
// guard let gender = user.value(forKey: "gender") else {print("Error getting user gender"); return}
// guard let profilePicture = user.value(forKey: "profilePicture") else {print("Error getting user profilePicture"); return}
// print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
}
})
}
我得到每個user.value(forKey)
線的錯誤,指出「不能調用非功能型AnyObject的價值。」
如果我在循環內我print(user.value)
我完全返回所有當前用戶的值。我無法單獨指定它們。
嗯,這是我想要設置用戶的價值,包括他們的UID的東西,用這個功能。他們註冊了該應用,並將其值存儲在Firebase中。然後當他們進入應用程序時,調用這個函數來設置他們的用戶對象的信息。 – KingTim
看到您的修改 - 這是所有3個答案推薦的相同方法,並導致崩潰。 – KingTim
你確定用戶已經登錄,並且你有一個有效的uid值嗎?如果孩子的鑰匙是空白的,你會得到一個崩潰... – Russell