Firebase +迅速检索用户数据
我只是试图从我的项目的Firebase检索数据。 例如,在UILabel中显示facebook用户名。 我存储这样的Facebook用户数据
然后使用以下命令检索数据
let ref = Firebase(url:"https://<app-name>.firebaseio.com/users/facebook:10207213459687665/name") ref.observeEventType(.Value, withBlock: { snapshot in self.facebookUserName.text = snapshot.value as! String })
它完美的工作,但它是非常愚蠢的检索用户名称在一个特定的path,因为这可能是不同的Facebook用户login。
我想检查用户login并显示他们的名字或检查currentUser或任何更聪明的方式来做到这一点? 我不知道该怎么做。
有100种不同的方法来做到这一点; 这是一对夫妇
users user_id_0 facebook_id: facebook:10207213459687665 name: Nicholas user_id_1 facebook_id: facebook:12346578912345689 name: Frank
在上面,你会查询你想要的facebook_id,这将返回节点和所有的子节点(名称,地址等)。 user_id_x是Firebase自动生成的节点名称(保证不同)
ref.queryOrderedByChild("facebook_id").queryEqualToValue("facebook:12346578912345689") .observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in print(snapshot.value) //prints the facebook_id and Frank })
另一种select是使用相同的数据结构并观察该节点以加载数据。 请记住,facebook id是节点的KEY,而不是值.value是key:值对。
let ref = Firebase(url:"https://<app-name>.firebaseio.com/users") let thisUser = ref.childByAppendingPath("facebook:12346578912345689") ref.observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in //snapshot will contain all of the child nodes let userName = snapshot.value.objectForKey("name") self.facebookUserName.text = userName })
如果你只关心用户名,你可以通过使用facebook id作为键来简化你的结构,值就是用户名:
users fb_10207213459687665: Nicholas fb_12346578912345689: Frank
并用上面的观察代码检索,除非你再次使用.value属性,如你最初的问题。
在这种情况下,.value属性是一个string,因为它是唯一的值(没有像你在发布的结构中的子节点,这可能会导致问题,因为它可能是一个系列的关键:值对会崩溃)
查询增加了一些开销,所以观察效率更高。
我在http://www.appcoda.com/firebase/find了答案
当我们试图从当前用户获取数据时,添加以下代码来存储uid(创build用户帐户时)
NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")
分配variables:
var CURRENT_USER_REF: Firebase { let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID) return currentUser! }
实现函数的代码:
<reference>.observeEventType(FEventType.Value, withBlock: { snapshot in let currentUser = snapshot.value.objectForKey("username") as! String <--your code--> print("Username: \(currentUser)") self.currentUsername = currentUser }, withCancelBlock: { error in print(error.description) }) }
然后我们可以在直接path上过时裁判。
我有同样的问题。 为了解决这个问题,我创build了一个自动引用login用户的variables:
class ViewController: UIViewController { let UsersRef = Firebase(url:"https://<app-name>.firebaseio.com/users")
然后,在试图获取用户数据的@IBOutlet下,写下:
let LoggedInUser = UsersRef.childByAppendingPath("\(UsersRef.authData.uid)")
运行代码时,“UsersRef.authData.uid”会自动replace为当前login用户的特定ID。这应该创buildlogin用户的数据库信息的直接path,而不必手动input用户的ID在参考中。