0
在我的應用程序中實現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)?有兩個冗餘?
我的代碼中還有一個通知觀察者。還沒有必要調用removeObserver?如果_authHandle已經是零,我可以不用removeStateDidChange而保留它嗎? –
@通知觀察者 - 它們自動由iOS for iOS版本9+處理。之前版本中需要removeObserver,因爲接收通知的受騙觀察員崩潰。情況並非如此。關於'removeStateDidChange' - 考慮在更合適的位置調用這個方法,比如'viewWillDisappear'或其他,這取決於你的應用程序邏輯。看看https://stackoverflow.com/q/37642091/3883492,它可能會幫助你。 –
我將它添加到viewWillDisappear,它似乎現在工作。 –