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)
}