Код не завершает функцию, он завершает выполнение на полпути - PullRequest
0 голосов
/ 13 января 2020

Мой код выглядит следующим образом:

@IBAction func clicked(_ sender: Any) {
        let ref = Database.database().reference()
        let pass = password.text
        var firpass = ""
        var bool = false;
        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)
        }
    }

«здесь» печатается, но bool никогда не печатается и отображается предупреждение. Почему мой код не входит в блок if bool и выдает предупреждение?

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Также вы должны установить переменную bool в false, когда вы переходите к следующему контроллеру представления после входа в систему. Чтобы снова войти в систему, а если пароль неправильный, вы не можете перейти на следующую страницу, и только на ней отображается предупреждение о неверном пароле.

0 голосов
/ 13 января 2020

Данные загружаются из 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)
    }
})

Также см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...