我只是尝试从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
})
它工作得很好但是通过检索特定路径中的用户名非常愚蠢,因为这可能是不同的Facebook用户登录。
我正在考虑检查用户是否已登录并显示其名称或检查currentUser或更智能的方式来执行此操作? 我不知道该怎么做。
答案 0 :(得分:2)
有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
})
另一种选择是使用相同的数据结构并观察该节点以加载数据。请记住,facebook id是节点的KEY,而不是值 - .value是键:值对。
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属性是一个字符串,因为它是唯一的值(在您发布的结构中没有子节点,这可能会导致问题,因为它可能是一系列键:值对哪会崩溃)
查询会增加一些开销,因此观察效率更高。
答案 1 :(得分:0)
我在http://www.appcoda.com/firebase/
中找到了答案当我们尝试从当前用户获取数据时,请在下方添加以下代码以存储uid(创建用户帐户时)
new_user = User.query.filter_by(email=posted_email).first()
分配变量:
NSUserDefaults.standardUserDefaults().setValue(result ["uid"], forKey: "uid")
实现功能代码:
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!
}
然后我们可以在直接路径中淘汰裁判。
答案 2 :(得分:0)
我遇到了同样的问题。为了解决这个问题,我创建了一个自动引用登录用户的变量:
class ViewController: UIViewController {
let UsersRef = Firebase(url:"https://<app-name>.firebaseio.com/users")
然后,在您尝试获取用户数据的@IBOutlet下,写下:
let LoggedInUser = UsersRef.childByAppendingPath("\(UsersRef.authData.uid)")
运行代码时,&#34; UsersRef.authData.uid&#34;由当前登录用户的特定ID自动替换。这应创建登录用户的数据库信息的直接路径,而无需在参考中手动输入用户ID。
答案 3 :(得分:0)
要检索Facebook用户的数据,我们可以使用FirebaseAuth的currentUser属性,该属性返回FIRUser,其中包含有关您用户的所有信息。读取所有用户数据后,您可以将其存储在任何地方,但出于本示例的目的,我使用了UserDefaults。
import Firebase
func getUserInformation()
{
let user = Auth.auth().currentUser
if let user = user {
UserDefaults.standard.setValue(user.displayName!, forKey: "Username")
let uid = user.uid
UserDefaults.standard.set(uid, forKey: "user_ID")
let url = "http://graph.facebook.com/\(uid)/picture?type=square"
UserDefaults.standard.set(url, forKey: "ImageData")
}
}