2017-10-20 115 views
0

在我的應用程序中實現FirebaseUI時,我使用添加.stateDidChangeListener來偵聽授權狀態的更改,但是當我嘗試通過向我的deinit添加.removeStateDidListener來刪除偵聽器時,我的應用程序崩潰。在調試控制檯中顯示以下內容:「致命錯誤:在解包可選值時意外發現零」,並突出顯示.removeStateDidListener(請參閱下圖)。 Picture of Error添加.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)?有兩個冗餘?

回答

1

我的猜測是_authHandle已經在deinit無零。如果可以的話,測試一下。另請注意,您無需爲iOS 9+撥打removeObserver方法。

+0

我的代碼中還有一個通知觀察者。還沒有必要調用removeObserver?如果_authHandle已經是零,我可以不用removeStateDidChange而保留它嗎? –

+0

@通知觀察者 - 它們自動由iOS for iOS版本9+處理。之前版本中需要removeObserver,因爲接收通知的受騙觀察員崩潰。情況並非如此。關於'removeStateDidChange' - 考慮在更合適的位置調用這個方法,比如'viewWillDisappear'或其他,這取決於你的應用程序邏輯。看看https://stackoverflow.com/q/37642091/3883492,它可能會幫助你。 –

+0

我將它添加到viewWillDisappear,它似乎現在工作。 –

相關問題