2017-04-07 514 views
0

編輯,在底部更新,僅檢索當前用戶的子值仍然有問題從火力地堡


我已經存儲了我的用戶在火力地堡這樣的 - 每個用戶的值存儲它們的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)我完全返回所有當前用戶的值。我無法單獨指定它們。

回答

0

它比你想象:-)

let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(FIRAuth.auth()?.currentUser?.uid) 
+0

嗯,這是我想要設置用戶的價值,包括他們的UID的東西,用這個功能。他們註冊了該應用,並將其值存儲在Firebase中。然後當他們進入應用程序時,調用這個函數來設置他們的用戶對象的信息。 – KingTim

+0

看到您的修改 - 這是所有3個答案推薦的相同方法,並導致崩潰。 – KingTim

+0

你確定用戶已經登錄,並且你有一個有效的uid值嗎?如果孩子的鑰匙是空白的,你會得到一個崩潰... – Russell

0

你需要另一個孩子添加到您的userRef

guard let uid = FIRAuth.auth()?.currentUser?.uid else { 
     return 
    } 

let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid) 
+0

我已經嘗試過,但它導致崩潰 - 不知道爲什麼,崩潰帶我到內存線程(?)屏幕。 – KingTim

0

首先獲取當前用戶的UID,

let currentUid = FIRAuth.auth()?.currentUser?.uid 

然後替換這個數據庫引用,

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

與此,

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

:-)

+0

我已經嘗試過這種方法,它會導致崩潰。 – KingTim

0

以下是我做我的用戶信息的負荷,

首先,我創建了一個NSObject類稱爲用戶...

import UIKit 

class User: NSObject { 

// Add Whatever Child values of the user you have here 
var email: String? 
var nickname: String? 

} 

然後我打電話

func GetUserInfo() { 

guard let uid = FIRAuth.auth()?.currentUser?.uid else { 
     return 
    } 

FIRDatabase.database().reference().child("users").child(uid) 
.observeSingleEvent(of: .value, with: { (snapshot) in 

      if let dictionary = snapshot.value as? [String: AnyObject] { 

       let user = User() 
       user.setValuesForKeys(dictionary) 
       print(user.nickname!) 

    }, withCancel: nil) 
} 

不知道如果這能幫助或不..

+0

我認爲這通常是我正在嘗試的,除非你不使用for循環,而是將快照轉換爲'[String:AnyObject]'。如果我嘗試爲uid添加一個子項,它一旦到達'observeSingleEvent'行就會崩潰。 – KingTim