添加.removeStateDidListener以使deinit导致应用程序崩溃

时间:2017-10-20 14:29:34

标签: ios firebase-authentication listener firebaseui

在我的应用程序中实现FirebaseUI时,我使用添加.stateDidChangeListener来侦听授权状态的更改,但是当我尝试通过将.removeStateDidListener添加到我的deinit来删除侦听器时,我的应用程序崩溃了。在调试控制台中显示以下内容“致命错误:在展开可选值时意外发现nil”并突出显示.removeStateDidListener(参见下图)。 Picture of Error

我在ViewController的顶部声明了这样的监听器:

var user: User?
let authUI = FUIAuth.defaultAuthUI()
fileprivate var _authHandle: AuthStateDidChangeListenerHandle!

这是我实现监听器的代码:

func configureAuth() {
    let providers: [FUIAuthProvider] = [FUIGoogleAuth()]
    authUI?.providers = providers

    // listen for change in authorization state
    _authHandle = Auth.auth().addStateDidChangeListener({ (auth: Auth, user: User?) in
        if let activeUser = user {
            if self.user != activeUser {
                self.user = activeUser
            }
        } else {
            // user must login
            self.loginSession()
        }
    })
} 

除了.removeStateDidChangeListener之外,错误是否是deinit中NotificationCenter.default.removeObserver(self)的结果?这两个都是多余的吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是_authHandle中的deinit已经为零。如果可以的话,测试一下。另请注意,您无需为iOS 9 +调用removeObserver方法。