Ios 将.removeStateDidListener添加到Denit会导致应用程序崩溃
在我的应用程序中实现FirebaseUI时,我使用add.stateDidChangeListener来侦听授权状态中的更改,但当我尝试通过向deinit添加.removeStateDidListener来删除侦听器时,我的应用程序崩溃。在调试控制台中显示以下致命错误:在展开可选值并突出显示.removeStateDidListener时意外发现nil请参见下图 我在ViewController的顶部声明侦听器,如下所示:Ios 将.removeStateDidListener添加到Denit会导致应用程序崩溃,ios,firebase-authentication,listener,firebaseui,Ios,Firebase Authentication,Listener,Firebaseui,在我的应用程序中实现FirebaseUI时,我使用add.stateDidChangeListener来侦听授权状态中的更改,但当我尝试通过向deinit添加.removeStateDidListener来删除侦听器时,我的应用程序崩溃。在调试控制台中显示以下致命错误:在展开可选值并突出显示.removeStateDidListener时意外发现nil请参见下图 我在ViewController的顶部声明侦听器,如下所示: var user: User? let authUI = FUIAuth
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之外,Denit中还有NotificationCenter.default.removeObserverself,这可能是错误的结果吗?这两个都是多余的吗?我猜,deinit中的authHandle已经为零了。如果可以的话,测试一下这个。还请注意,对于iOS 9+,您不需要调用removeObserver方法。我的代码中还有一个通知观察员。是否仍然不需要调用removeObserver?如果_authHandle已经为零,我可以不使用removeStateDidChange吗?@Notification observer?它们将由iOS版本9+的iOS自动处理。在以前的版本中需要removeObserver,这是因为接收通知的Denited观察员崩溃。情况不再如此。关于RevestestDeDechange——考虑调用这个方法在更合适的地方,如VIEWWORD WORD或其他,取决于您的应用程序逻辑。再看一看,它可能会对您有所帮助。我将它添加到ViewWillEnglish中,现在它似乎正在工作。