2017-10-20 6 views
0

내 응용 프로그램에서 FirebaseUI를 구현할 때 .stateDidChangeListener를 사용하여 권한 부여 상태의 변경 사항을 수신하지만, 내 응용 프로그램에 .removeStateDidListener를 추가하여 리스너를 제거하려고하면 충돌. 디버그 콘솔에 다음을 표시합니다. "치명적인 오류 : 선택적 값을 언 래핑하는 동안 예기치 않게 nil이 발견되었습니다."및 .removeStateDidListener가 강조 표시됩니다 (아래 그림 참조). Picture of Errorderemit에 .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에 nil입니다. 가능한 경우 테스트 해보십시오. 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에 추가했는데 현재 작동하고있는 것 같습니다. –