Правильный способ реализации Firebase Auth с слушателем состояний Swift 5 - PullRequest
0 голосов
/ 04 марта 2020

очень новый для ios разработки и Firebase.

Я реализовал стандартный поток пользовательского интерфейса, когда приложение открывается на экран Spla sh, где проверяется, вошел ли пользователь в систему или нет, и в зависимости от состояния пользователя перенаправлен на экран входа в систему или домашний экран. Я пытаюсь получить идентификатор пользователя от слушателя аутентификации, и некоторые из моих вызовов getUserId из userManager происходят до того, как аутентификация firebase дает ненулевой идентификатор пользователя, и пользователь всегда заканчивает тем, что идет к экрану регистрации. Хотелось бы узнать, каковы лучшие практики для реализации извлечения идентификатора пользователя со слушателями. Вот некоторый код для поддержки того, что я делаю

class UserManager {

    static let shared = UserManager()
    private var currentUserId: String?

    private init() {
        print("init initiated")
        _ = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
            // User is signed in
                print("user id is: \(user.uid)")
                self.currentUserId = user.uid
                print("current user id loaded: \(self.currentUserId)")
            }
        }
    }

    func getCurrentUserId() -> String?{
        print("returning user id: \(currentUserId)")
        return currentUserId
    }


Вывод на печать из консоли выглядит примерно так: (Пользовательский запрос запускается до того, как состояние слушателя firebase изменится на ненулевое значение

nit initiated
returning user id: nil
nil
user id is: c0wTlE5EXaao3aO0rH9J6GKvuM43
current user id loaded: Optional("c0wTlE5EXaao3aO0rH9J6GKvuM43")

Я попытался инициализировать UserManager непосредственно из AppDelegate, надеясь, что к тому времени, когда остальная часть приложения запустит одноэлементный экземпляр usermanager, будет успешно получено последнее состояние, но, очевидно, это не работает .

1 Ответ

0 голосов
/ 04 марта 2020

Почему бы вам не попробовать это с обработчиком завершения закрытия?

Примерно так:

Внутри UserManager объявить:

var authDidChange: ((String) -> Void)?

Внутри addStateDidChangeListener завершение:

authDidChange?(user.uid)

Так что, когда вы используете UserManager, вы получите обновления аутентификации, такие как:

UserManager.shared.authDidChange = { userId in
    print("The obtained user id is: ", userId)
}
...