addAuthStateDidChangeListener被调用两次的问题

时间:2016-06-03 13:39:25

标签: ios swift firebase firebase-realtime-database firebase-authentication

我正在使用Firebase,根据他们的文档,我正在检查用户的登录状态是否发生了变化。问题在于侦听器块,其中代码在应用程序启动时被调用两次(用户已登录)。这不是太多的交易,但Firebase在连接中创建两个值并删除它们。我该如何解决这个问题?我需要在监听器中获取用户之后调用它,而不是在外部,因为如果用户未完成首先获取用户数据,则无法保证用户将存在于该块之外。

FIRAuth.auth()?.addAuthStateDidChangeListener { auth, user in
        if let theUser = user {
            // User is signed in.

            // CODE IN HERE IS CALLED TWICE UPON APP LAUNCH (WHEN USERS LOGGED IN).... WHY?
            self.currentUser = theUser
            print("LOGGED IN!!!!")


            self.updateUsersStatus(user: self.currentUser)

        } else {
            // No user is signed in.
            self.performSegueWithIdentifier(SEGUE_LOG_IN, sender: self)
        }
    }

2 个答案:

答案 0 :(得分:8)

我遇到了Jamie22报道的相同问题。奇怪的是 - 我有两个类似的应用程序设置,但只有一个应用程序在更改时调用两次auth状态侦听器方法。

这个解决方法就是为我解决了这个问题:

var activeUser:FIRUser!

override func viewDidLoad() {
    super.viewDidLoad()

    FIRAuth.auth()?.addAuthStateDidChangeListener({ (auth:FIRAuth, user:FIRUser?) in
        if let user = user {
            if(self.activeUser != user){
                self.activeUser = user
                print("-> LOGGED IN AS \(user.email)")
            }
        } else {
            print("-> NOT LOGGED IN")
        }
    })
}

通过检查appUser在auth状态更改时是否已更改,您可以摆脱第二个呼叫,因为它将等于您在第一次呼叫中获得的用户。

答案 1 :(得分:6)

+点击或选项 +点击addAuthStateDidChangeListener功能。您将看到以下内容:

Registers a block as an "auth state did change" listener. To be invoked when:
    - The block is registered as a listener,
    - The current user changes, or,
    - The current user's access token changes.

总结一下 - 立即调用块get,然后在验证FIRApp和/或FIRAuth对象不包含任何陈旧数据后,很可能再次调用。因此,应该预期并适当地管理两次调用回调的行为。