Здесь вы имеете дело с функцией asynchronous
, и вы также находитесь внутри closure
, что означает, что как только вы покинете закрытие, присвоенные значения внутри закрытия будут недоступны. Вам нужно completionHandler
, чтобы разобраться с этим. Вы можете сделать из него отдельную функцию, а затем вызвать ее внутри authenticateUserAndConfigureView
.
func getName(completion:@escaping((String)->()) {
Database.database().reference().child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let username = value?["Username"] as? String ?? ""
completion(name)
}
И затем вы можете вызвать эту функцию следующим образом.
getName{(nameOfUser) in
print("Name is \(nameOfUser)")
}
В вашем случае:
Звонок внутри authenticateUserAndConfigureView
func authenticateUserAndConfigureView() {
if (......) {
//All your code
}
else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tabBar = storyboard.instantiateViewController(identifier: "MainVC") as! UITabBarController
let menuVC = tabBar.viewControllers?[0] as! MenuViewController
self.getName{(name) in
menuVC.greetText = "Hi" + name
}
}
}
Возможно, вам понадобится использовать DispatchQueue
для возможной проблемы timing
, но я не уверен в этом. Если да, дайте мне знать.