2017-10-20 116 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,它似乎现在工作。 –

相关问题