如何与Firestore数据同步更新UILabel?

问题描述 投票:0回答:1

我目前正在构建一个iOS应用,该应用将同步来自Firestore的帐户信息。我已经完成了登录/注册过程并可以正常工作。但是,我需要帮助了解如何在用户登录/注销时自动更新logInOutBtn中的fullNameTxtemailTxtMenuVC。当前,它会在我关闭然后重新打开菜单时进行更新,但是在不关闭菜单的情况下我应该如何使用它来自动更新呢?谢谢!

// MenuVC

override func viewDidAppear(_ animated: Bool) {

        if let user = Auth.auth().currentUser , !user.isAnonymous {
            // We are logged in
            logInOutBtn.setTitle("Logout", for: .normal)
            if UserService.userListener == nil {
                UserService.getCurrentUser {
                    self.fullNameTxt.text = UserService.user.fullName
                    self.emailTxt.text = UserService.user.email
                }
            }
        } else {
            logInOutBtn.setTitle("Login", for: .normal)
            self.fullNameTxt.text = "Sign in or create an account"
            self.emailTxt.text = "to continue."
        }
    }

@IBAction func logInOutClicked(_ sender: Any) {

        guard let user = Auth.auth().currentUser else { return }

            if user.isAnonymous {
                presentLoginController()
            } else {
                do {
                    try Auth.auth().signOut()
                    UserService.logoutUser()
                    Auth.auth().signInAnonymously { (result, error) in
                        if let error = error {
                            debugPrint(error)
                            Auth.auth().handleFireAuthError(error: error, vc: self)
                        }
                        self.presentLoginController()
                    }
                } catch {
                    debugPrint(error)
                    Auth.auth().handleFireAuthError(error: error, vc: self)
                }
            }
        }

// UserService

func getCurrentUser(completion: @escaping () -> ()) {

        guard let authUser = auth.currentUser else { return }
        let userRef = db.collection("users").document(authUser.uid)

        userListener = userRef.addSnapshotListener({ (snap, error) in

            if let error = error {
                debugPrint(error.localizedDescription)
                return
            }

            guard let data = snap?.data() else { return }
            self.user = User.init(data: data)
            completion()
        })

//用户模型

struct User {

    var fullName: String
    var address: String
    var id: String
    var email: String
    var stripeId: String

    init(fullName: String = "",
         address: String = "",
         id: String = "",
         email: String = "",
         stripeId: String = "") {

        self.fullName = fullName
        self.address = address
        self.id = id
        self.email = email
        self.stripeId = stripeId
    }

    init(data: [String : Any]) {
        fullName = data["fullName"] as? String ?? ""
        address = data["address"] as? String ?? ""
        id = data["id"] as? String ?? ""
        email = data["email"] as? String ?? ""
        stripeId = data["stripeId"] as? String ?? ""
    }

    static func modelToData(user: User) -> [String : Any] {

        let data : [String : Any] = [
            "fullName" : user.fullName,
            "address" : user.address,
            "id" : user.id,
            "email" : user.email,
            "stripeId" : user.stripeId
        ]

        return data
    }

}

//我的应用菜单

enter image description here

swift firebase google-cloud-firestore swrevealviewcontroller
1个回答
0
投票

登出过程非常简单,被标记为抛出,因此,如果失败,它将生成可以由catch处理的错误。它不是异步的,因此不会(或不需要)关闭。

简单地说

func signOut() {

    let firebaseAuth = Auth.auth()

    do {
        try firebaseAuth.signOut()
        print("successful signout")
        self.logInOutBtn.setTitle("Log In", for: .normal)
        self.fullNameTxt.text = ""
        self.emailTxt.text = ""

    } catch let signOutError as NSError {
        print ("Error signing out: %@", signOutError)
        //present the error to the user/handle the error
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.