在我的应用程序中实现FirebaseUI时,我使用添加.stateDidChangeListener来侦听授权状态的更改,但是当我尝试通过将.removeStateDidListener添加到我的deinit来删除侦听器时,我的应用程序崩溃了。在调试控制台中显示以下内容“致命错误:在展开可选值时意外发现nil”并突出显示.removeStateDidListener(参见下图)。
我在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)的结果?这两个都是多余的吗?
答案 0 :(得分:1)
我的猜测是_authHandle
中的deinit
已经为零。如果可以的话,测试一下。另请注意,您无需为iOS 9 +调用removeObserver
方法。