私のアプリでFirebaseUIを実装すると、.stateDidChangeListenerを追加して承認状態の変更を待ちますが、私のアプリケーションに.removeStateDidListenerを追加してリスナーを削除しようとするとクラッシュします。デバッグコンソールに「致命的なエラーが発生しました:オプション値のアンラッピング中に予期せぬエラーが発生しました」と表示され、.removeStateDidListenerが強調表示されます(下の図を参照)。 .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)がありますか?両方とも冗長ですか?
また、私のコードに通知オブザーバがあります。 removeObserverを呼び出す必要はありませんか? _authHandleがすでにnilの場合は、removeStateDidChangeを指定しないで残すことができますか? –
@Notification observer - これらは、iOSバージョン9以降のiOSによって自動的に処理されます。 deinited observersが通知を受け取るとクラッシュするため、以前のバージョンでremoveObserverが必要でした。これはもはや事実ではありません。 'removeStateDidChange'について - アプリケーションロジックに応じて、このメソッドを' viewWillDisappear'などのより適切な場所で呼び出すことを検討してください。 https://stackoverflow.com/q/37642091/3883492もご覧ください。役立つかもしれません。 –
私はそれをviewWillDisappearに追加しました、そして今働いているようです。 –