Как узнать, когда fetchProviders () завершил выполнение? - PullRequest
0 голосов
/ 02 октября 2018

Я создаю функцию для своего приложения, которая позволяет пользователям регистрироваться по электронной почте.Я использую Firebase, и я хотел бы использовать fetchProviders() из API Firebase.

Это то, что у меня есть:

func submitEmail() {
    var errorMessage = [String()]

    Auth.auth().fetchProviders(forEmail: email) { (providers, error) in
        if let error = error {
            print(error.localizedDescription)
        } else if let providers = providers {
            errorMessage.append("Error - email already in use")
            print(errorMessage) // prints "Error - email already in use"
        }
    }

print(errorMessage) // prints []

if errorMessage.count > 0 {
    /* show alert */
}

Теперь моя проблема здесь ясна;Функции обратного вызова выполняются асинхронно , поэтому errorMessage.count будет равно 0, когда мы перейдем к оператору if , просто потому, что функция обратного вызова работает в другом потоке.

Требуемое поведение: Я бы хотел, чтобы мой поток пользовательского интерфейса зависал, ожидая, пока не будет вызвана функция обратного вызова, чтобы, если электронное письмо уже было в базе данных, оно могло быть обнаружено.Я хотел бы найти элегантный способ сделать это (не уверен, что хорошая практика в этом случае).Да, я мог бы поставить там таймер, чтобы угадать, когда будет выполнен обратный вызов, но это будет довольно ужасный способ сделать это (поскольку время выполнения этого обратного вызова зависит от соединения с Firebase).

1 Ответ

0 голосов
/ 02 октября 2018

Для извлечения провайдеров может потребоваться звонок на серверы бэкэнда.Поскольку это может занять некоторое время, это происходит асинхронно.Как только данные доступны, вызывается ваш обработчик завершения.Это означает, что данные о поставщиках доступны только внутри обработчика завершения.Поэтому, если вам нужны поставщики или сообщение об ошибке, ваш код должен быть внутри этого обработчика завершения.

Например:

func submitEmail () {var errorMessage = [String ()]

Auth.auth().fetchProviders(forEmail: email) { (providers, error) in
    if let error = error {
        print(error.localizedDescription)
    } else if let providers = providers {
        errorMessage.append("Error - email already in use")
        print(errorMessage) // prints "Error - email already in use"
    }
    if errorMessage.count > 0 {
        /* show alert */
    }
}
...