【问题标题】:Adding .removeStateDidListener to deinit causes Application to Crash将 .removeStateDidListener 添加到 deinit 会导致应用程序崩溃
【发布时间】:2017-10-20 14:29:34
【问题描述】:

在我的应用程序中实现 FirebaseUI 时,我使用添加 .stateDidChangeListener 来监听授权状态的变化,但是当我尝试通过将 .removeStateDidListener 添加到我的 deinit 来删除监听器时,我的应用程序崩溃了。在调试控制台中显示以下内容“致命错误:在展开可选值时意外发现 nil”并突出显示 .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) 是否会导致错误?两者都是多余的吗?

【问题讨论】:

    标签: ios firebase-authentication listener firebaseui


    【解决方案1】:

    我的猜测是_authHandledeinit 中已经为零。如果可以的话,测试一下。另请注意,对于 iOS 9+,您不需要调用 removeObserver 方法。

    【讨论】:

    • 我的代码中还有一个通知观察者。还是不需要调用removeObserver吗?如果 _authHandle 已经为零,我可以在没有 removeStateDidChange 的情况下保留它吗?
    • @Notification 观察者 - 它们由 iOS 9+ 的 iOS 自动处理。由于取消初始化的观察者收到通知时崩溃,因此在以前的版本中需要 removeObserver。情况不再如此。关于removeStateDidChange - 考虑在更合适的位置调用此方法,如viewWillDisappear 或其他,具体取决于您的应用程序逻辑。也看看stackoverflow.com/q/37642091/3883492,它可能对你有帮助。
    • 我将它添加到 viewWillDisappear 中,它现在似乎可以工作了。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多