2017-10-20 7 views
0

私のアプリでFirebaseUIを実装すると、.stateDidChangeListenerを追加して承認状態の変更を待ちますが、私のアプリケーションに.removeStateDidListenerを追加してリスナーを削除しようとするとクラッシュします。デバッグコンソールに「致命的なエラーが発生しました:オプション値のアンラッピング中に予期せぬエラーが発生しました」と表示され、.removeStateDidListenerが強調表示されます(下の図を参照)。 Picture of Error.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)がありますか?両方とも冗長ですか?

答えて

1

_authHandleはすでにdeinitにはありません。可能ならばこれをテストしてください。また、iOS 9以降でremoveObserverメソッドを呼び出す必要はありません。

+0

また、私のコードに通知オブザーバがあります。 removeObserverを呼び出す必要はありませんか? _authHandleがすでにnilの場合は、removeStateDidChangeを指定しないで残すことができますか? –

+0

@Notification observer - これらは、iOSバージョン9以降のiOSによって自動的に処理されます。 deinited observersが通知を受け取るとクラッシュするため、以前のバージョンでremoveObserverが必要でした。これはもはや事実ではありません。 'removeStateDidChange'について - アプリケーションロジックに応じて、このメソッドを' viewWillDisappear'などのより適切な場所で呼び出すことを検討してください。 https://stackoverflow.com/q/37642091/3883492もご覧ください。役立つかもしれません。 –

+0

私はそれをviewWillDisappearに追加しました、そして今働いているようです。 –

関連する問題