Данные загружаются из Firebase асинхронно, так как это может занять некоторое время. Вместо того, чтобы заставлять ваше приложение ждать данных (что было бы плохо для пользователя), ваш основной код продолжается во время загрузки данных, а затем, когда данные становятся доступны, вызывается ваше закрытие.
Это объясняет поведение, которое вы видите: к тому времени, когда ваш runs, the
еще не запустился.
решение столь же просто, как изначально поначалу сбивает с толку и раздражает: любой код, который нужны данные из базы данных должны быть внутри замыкания или вызываться оттуда.
Так, например:
ref.child(name.text as! String).child("password").observeSingleEvent(of: .value, with: { dataSnapshot in
firpass = dataSnapshot.value as! String
if firpass == pass {
bool = true
print("in here")
}
print(bool)
if bool {
self.sendname = name.text!
let vc = DatabaseTableViewController(nibName: "DatabaseTableViewController", bundle: nil)
vc.finalName = self.sendname
navigationController?.pushViewController(vc, animated: true)
performSegue(withIdentifier: "username", sender: self)
} else {
let alert = UIAlertController(title: "Error", message: "Incorrect username or password", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
})
Также см .: