【问题标题】:is this firestore closure causing a memory leak?这个firestore关闭会导致内存泄漏吗?
【发布时间】:2021-06-05 09:00:20
【问题描述】:

所以我的目标是在实例化正确的 viewController 时解决这个条件问题。我有一个函数,我基本上用来根据用户的类型以及他们是否登录来将用户导航到正确的 viewController。

这是这个函数:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }

    let window = UIWindow(windowScene: windowScene)
    self.window = window

    let auth = Auth.auth()
    let actualuser = Auth.auth().currentUser


    auth.addStateDidChangeListener { (_, user) in
        if user != nil {

            db.document("student_users/\(actualuser?.uid)").getDocument { (docSnapshot, error) in
                if error != nil {
                    print("\(error)")
                } else {
                    let docSnap = docSnapshot?.exists
                    guard docSnap! else {
                        let alreadyLoggedInAsASchoolViewController = self.storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.SchoolEventDashboardStoryboardID) as! SchoolTableViewController
                        let navigationizedSchoolVC = UINavigationController(rootViewController: alreadyLoggedInAsASchoolViewController)
                        self.window!.rootViewController = navigationizedSchoolVC
                        self.window!.makeKeyAndVisible()
                        return
                    }
                        let alreadyLoggedInAsAStudentViewController = self.storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.StudentEventDashboardStoryboardID) as! StudentSegmentedTableViewController
                        let navigationizedVC = UINavigationController(rootViewController: alreadyLoggedInAsAStudentViewController)
                        self.window!.rootViewController = navigationizedVC
                        self.window!.makeKeyAndVisible()
                 
                }
            }
        } else {
            let notLoggedInAtAll = self.storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.GothereMainMenuStoryboardID) as! GothereMainMenuViewController
            let navMainMenu = UINavigationController(rootViewController: notLoggedInAtAll)
            self.window!.rootViewController = navMainMenu
            self.window!.makeKeyAndVisible()
        }
    }
}

我也有类似这样的代码块,用于sceneDidEnterForeground,用于推送通知。现在的问题是,当我第一次运行模拟器并启动应用程序时,会显示正确的 viewController,但是当我以学校用户身份注销并在同一个模拟器会话中以学校用户身份登录时,错误的 viewController(又名其他类型用户的视图控制器)显示出来。

这并不是生产中的真实情况,学生用户只能访问学校用户的帐户并在同一个场景会话中像那样登录,但安全总比抱歉好。所以这让我问,这是内存泄漏还是完全不同的问题?

我也收到此错误:

【问题讨论】:

    标签: swift google-cloud-firestore memory-leaks uiscenedelegate guard-statement


    【解决方案1】:

    您的查询基于变量actualuser,看起来它只设置了一次,在首次设置场景时。在状态更改回调中,它永远不会更新。

    因此,当您注销,然后以其他用户身份重新登录时,将使用 actualuser 的初始值,这解释了您看到错误视图控制器的原因。然后,当您再次运行应用程序并设置场景时,actualuser 再次设置为 auth().currentUser,向您显示正确的视图控制器。

    这里的解决方案是将您的查询基于当前(和当前)用户。

    类似:

     db.document("student_users/\(user.uid)")
    

    (不要检查user != nil,而是使用let user = user 进行可选绑定,然后您可以避免? 解包)

    顺便说一句,这不是内存泄漏,而是另一种类型的问题:https://en.wikipedia.org/wiki/Memory_leak

    【讨论】:

    • 就是这样,我的文档路径中包含可选的用户 uid,我不能将 user 的闭包值放在我的文档路径中,因为它不会让我有可选类型关于值,这就是我使用 actualuser 变量的原因。我是否应该修改我的文档路径,它是严格意义上没有Optional 前缀的用户ID?或者有解决方法吗? @jnpdx
    • 我不明白这个问题。您当前的actualuser 是可选的。闭包内的user 是一个可选的。好像没什么区别。如果您不想要可选的(我认为您不会),请使用我在回答中推荐的 let user = user 模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多