I'm trying to read user data from Firebase but the username variable is always 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)
Here's an image of the firebase database.

usernameoutside of the block; this is an asynchronous operation. Of course it's nil, it hasn't been set yet by the time it hits that line.