我是Swift和Firebase的新手,想知道如何通过userId从Firebase获取用户详细信息。
我将Firebase'uid'存储在NSUserDefauls中。
我有一个像下面这样的用户Model类;
import UIKit
import Firebase
class User: NSObject {
var id: String?
var username: String?
var email: String?
var yogaLevel : Enums.Difficulty?
init(id: String, username: String, email: String){
self.id = id
self.username = username
self.email = email
}
override init(){
super.init()
}
}
我有一个dataservie类,可以对Firebase进行相关调用;
import UIKit
import Firebase
class DataService{
static let dataService = DataService()
private var _BASE_REF = Firebase(url: "\(BASE_URL)")
private var _USER_REF = Firebase(url: "\(BASE_URL)/users")
var BASE_REF: Firebase {
return _BASE_REF
}
var USER_REF: Firebase {
return _USER_REF
}
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!
}
func createNewAccount(uid: String, user: Dictionary<String, String>) {
// A new user is created:
USER_REF.childByAppendingPath(uid).setValue(user)
}
}
我还有一个管理器类,我想包含返回用户详细信息的方法。
import UIKit
import Firebase
class UserManager: NSObject {
static var currentUser = User()
class func getCurrentUserDetails() -> User{
// Attach a closure to read the data at our posts reference
DataService.dataService.CURRENT_USER_REF.observeEventType(.Value, withBlock: { snapshot in
currentUser.username = String(snapshot.value.objectForKey("username"))
currentUser.email = String(snapshot.value.objectForKey("email"))
currentUser.id = String(NSUserDefaults.standardUserDefaults().valueForKey("uid"))
print(String(currentUser.username) + " " + String(currentUser.email))
}, withCancelBlock: { error in
print("UserManager class - getCurrentUserDetails error: " + String(error.description))
})
return currentUser
}
}
我想建议如何在管理器类中创建一个函数,返回使用我存储的'uid'从Firebase填充的'user'。有人可以指出我正确的方向。
如果您需要更多信息或更多代码,请发表评论。
答案 0 :(得分:2)
这是一个非常开放的问题所以我的回答是方向的。
当前登录的用户uid可以直接从Firebase返回:
if self.myRootRef.authData != nil {
print(ref.authData.uid) // user is authenticated
} else {
// No user is signed in
}
要回答问题,请假设Firebase结构为
root
users
uid_0
name: "Leroy"
email: "l.jenkins@ubrs.com"
假设用户类
class UserClass: NSObject {
var name: String?
var email: String?
var uid: String?
}
然后,要填充User类,可以使用以下代码调用函数
self.populateUser("uid_0")
这里是从Firebase填充User类并将其添加到Users数组的功能。然后可以使用该数组填充tableView。
func populateUser(uid: String) {
let thisUserRef = self.usersRef.childByAppendingPath(uid)
thisUserRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
if snapshot.value is NSNull {
print("snapshot was null");
} else {
let thisUser = UserClass()
thisUser.name = snapshot.value.objectForKey("name") as? String
thisUser.email = snapshot.value.objectForKey("email") as? String
thisUser.uid = uid
self.Users.append(thisUser)
print("\(thisUser.name!)")
}
})
}
self.Users是一个如此定义的类变量数组
var Users = [UserClass]()
注意1:如果DataService类中的变量本质上是全局变量,您只需在swift项目中创建一个文件并将它们添加到结构中
MyGlobalVars.swift
struct MyGlobals {
static var rootRef = "app.firebase.com"
static var usersRef = "app.firebase.com/users"
}
可以使用
随处访问print("Global variable:\(MyGlobals.usersRef)")
注意2:在您的Users类中,您可以使用init将快照传递给Users类,并让它自己填充。
thisUser.populateFromSnapshot(snapshot.value)