Swift 2.0 - 从firebase获取用户详细信息

时间:2016-03-29 12:27:50

标签: swift model firebase

我是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'。有人可以指出我正确的方向。

如果您需要更多信息或更多代码,请发表评论。

1 个答案:

答案 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)