我是Swift和Firebase的新手,想知道如何通过userId从Firebase获取用户详细信息。
我已将Firebase"uid"存储在NSUserDefauls中。
我有一个用户模型类,如下所示;
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()
}
}
我有一个数据服务类,它对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)
}
}
我还有一个manager类,我希望它包含返回用户详细信息的方法。
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"。有人能告诉我正确的方向吗。
如果您需要更多信息或更多代码,请发表评论。
这是一个非常开放的问题,所以我的答案是方向。
当前登录的用户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!)")
}
})
}
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)