添加.removeStateDidListener以deinit导致应用程序崩溃
问题描述:
在我的应用程序中实现FirebaseUI时,我使用添加.stateDidChangeListener来侦听授权状态的更改,但是当我尝试通过向我的deinit添加.removeStateDidListener来删除侦听器时,我的应用程序崩溃。在调试控制台中显示以下内容:“致命错误:在解包可选值时意外发现零”,并突出显示.removeStateDidListener(请参阅下图)。 添加.removeStateDidListener以deinit导致应用程序崩溃
我宣布这样的听众在我的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)?有两个冗余?
答
我的猜测是_authHandle
已经在deinit
无零。如果可以的话,测试一下。另请注意,您无需为iOS 9+拨打removeObserver
方法。
我的代码中还有一个通知观察者。还没有必要调用removeObserver?如果_authHandle已经是零,我可以不用removeStateDidChange而保留它吗? –
@通知观察者 - 它们自动由iOS for iOS版本9+处理。之前版本中需要removeObserver,因为接收通知的受骗观察员崩溃。情况并非如此。关于'removeStateDidChange' - 考虑在更合适的位置调用这个方法,比如'viewWillDisappear'或其他,这取决于你的应用程序逻辑。看看https://*.com/q/37642091/3883492,它可能会帮助你。 –
我将它添加到viewWillDisappear,它似乎现在工作。 –