Считать базу данных firebase и сохранить в строковой переменной сбой - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь прочитать пользовательские данные из Firebase, но переменная username всегда равна nil.

let storage = Storage.storage()
let storageRef = storage.reference()
let userID = Auth.auth().currentUser?.uid
let canvasName = NSUUID().uuidString
var username: String? = nil

//get username
self.ref.child("Users").observeSingleEvent(of: .value, with: { (snapshot) in
    let usersProfile = snapshot.value as? NSDictionary
    let userProfile = usersProfile![userID!] as? NSDictionary
    username = userProfile!["Username"] as? String            
}) { (error) in
    print(error.localizedDescription)
}

//create new canvas
let canvasValue:[String:Any] = ["UserID":userID!,
                                "Username": username!,//always nil 
                                "TimeCreated": NSDate().timeIntervalSince1970,
                               ]
let canvasAutoID = self.ref.child("Users").child(userID!).child("Canvas").childByAutoId().key
    self.ref.child("Canvas").child(canvasAutoID!).setValue(canvasValue)

Вот изображение базы данных Firebase.

image here

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

observeSingleEvent работает асинхронно.Может потребоваться выполнить сетевой запрос для получения этих данных, поэтому закрытие будет выполняться через некоторое неопределенное время после вызова функции.Код после него, где вы пытаетесь получить доступ к username, запускается первым, что означает, что username все еще имеет свое начальное значение nil.Это можно исправить, переместив код внутри замыкания, как показано ниже, или поместив его в другую функцию, которую вы вызываете из замыкания.

//get username
self.ref.child("Users").observeSingleEvent(of: .value, with: { (snapshot) in
    let usersProfile = snapshot.value as? NSDictionary
    let userProfile = usersProfile![userID!] as? NSDictionary
    username = userProfile!["Username"] as? String 
    //create new canvas
    let canvasValue:[String:Any] = ["UserID":userID!,
                                    "Username": username!, 
                                    "TimeCreated": NSDate().timeIntervalSince1970,
                                   ]
    let canvasAutoID = self.ref.child("Users").child(userID!).child("Canvas").childByAutoId().key
    self.ref.child("Canvas").child(canvasAutoID!).setValue(canvasValue)          
}) { (error) in
        print(error.localizedDescription)
}
0 голосов
/ 12 декабря 2018

Вы можете получить свое имя пользователя, как показано ниже.

 self.ref.child("Users").observe(.value) { (snapshot) 
          if snapshot.childrenCount > 0 {
               for users in snapshot.children.allObjects as! [DataSnapshot] {  
                     let userObject = users.value as? [String: AnyObject]
                     let userName  = userObject?["Username"] as! String 
                     print(userName)
                }
            } else {
                print("No users")
            }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...