2016-03-29 5 views
0

Я новичок в Swift и Firebase, и хотел бы знать, как получить информацию пользователей от Firebase от пользователя.Swift 2.0 - получить информацию о пользователе от firebase

У меня есть «uid» Firebase, хранящийся в 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() 
} 
} 

У меня есть класс 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 
} 

}

Я хотел бы посоветовать, как я создать функцию в классе менеджера, возвращает «пользователь», который заполняется из Firebase с помощью «UID» Я хранится. Может кто-то, пожалуйста, назовите меня в правильном направлении.

Прокомментируйте, если вам нужна дополнительная информация или более код.

+0

Если ваши данные защищены правилами безопасности, вам может потребоваться authUser() –

+0

@CodyWeaver, похоже, моя проблема не в том, что я впервые ожидал. Я могу вернуть данные с кодом комментария выше в классе менеджера. Однако я не могу хранить данные против объекта пользователя. Можете ли вы посоветовать, как я это делаю в быстром режиме (нет геттеров и сеттеров в Swift?) – Jasper

+0

Существует ряд проблем с этим кодом: вам, вероятно, не нужно хранить пользователей uid в NSUserDefaults, поскольку текущий вход в uid всегда доступны из Firebase authData. Во-вторых, помните, что Firebase является асинхронным, поэтому вызов «return currentUser» в классе менеджера может фактически произойти * до того, как * данные были возвращены в блоке registerEventType, что может привести к сбою приложения. Похоже, что имеется много постороннего кода - если вы просто хотите получить пользовательский узел текущего пользователя и заполнить пользовательский класс, он должен составлять около 10 строк кода. – Jay

ответ

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: "[email protected]" 

Предположим, класс пользователей

class UserClass: NSObject { 
    var name: String? 
    var email: String? 
    var uid: String? 
} 

Затем, чтобы заполнить класс User, следующий код может использоваться для вызова функции

self.populateUser("uid_0") 

вот функция, чтобы заполнить класс пользователя из Firebase и добавить его в массив Users. Затем этот массив можно было бы использовать для заполнения таблицыView.

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 носят глобальный характер, вы можете просто создать файл в быстром проекте и добавить их в структуру

MyGlobalVars.swift 

struct MyGlobals { 
    static var rootRef = "app.firebase.com" 
    static var usersRef = "app.firebase.com/users" 
} 

Таковыми могут быть доступны в любом месте с

print("Global variable:\(MyGlobals.usersRef)") 

Примечание 2: Как и в вашем классе «Пользователи», вы можете просто передать моментальный снимок в класс «Пользователи» с помощью init и позволить ему также заполнить его.

thisUser.populateFromSnapshot (моментальный снимок.value)

+0

Спасибо за знание @jay. Надеюсь, вы можете помочь с проблемой, которую я выполняю по вашему маршруту. Когда я создаю нового пользователя (зарегистрируйтесь), я перехожу к основному контроллеру, который вызывает «populateUser», и по какой-то причине моментальный снимок равен нулю. Это связано с тем, что Firebase является асинхронной? – Jasper

+0

@CottonSocksBro Процесс: предварительный вход для пользователя, сбор информации и попытка аутентификации. Когда аутентификация завершается, вызывается код внутри блока auth. Он может пройти или провалиться, поэтому, когда он будет успешным, * затем * вызовите заполняемого пользователя, и когда это будет успешным (внутри блока), * затем * перейдите к главному контроллеру. Вам необходимо обеспечить, чтобы ваш код всегда позволял Firebase возвращать свои данные в блоке, а затем на основе возвращенных данных переходите к следующему шагу. Трудно сначала обернуть вокруг себя мозг, но он придет со временем. – Jay