这个 firestore 关闭是否导致内存泄漏?
is this firestore closure causing a memory leak?
因此,我的目标是在实例化右侧时解决此条件问题 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(又名其他类型用户的 viewController)。
这并不是说在生产环境中学生用户只能访问学校用户的帐户并像在同一场景会话中那样登录,但安全总比后悔好。所以这导致我问,这是内存泄漏还是完全不同的问题?
我也遇到这个错误:
您的查询基于变量 actualuser
,看起来它只设置了一次,即在首次设置场景时。在状态更改回调中,它永远不会更新。
因此,当您注销,然后以其他用户身份重新登录时,将使用 actualuser
的初始值,这解释了为什么您会看到错误的视图控制器。然后,当您再次 运行 应用程序并设置场景时, actualuser
再次设置为 auth().currentUser ,向您显示正确的视图控制器。
此处的解决方案是根据当前(和当前)用户进行查询。
类似于:
db.document("student_users/\(user.uid)")
(而不是检查 user != nil
,使用 let user = user
进行可选绑定,然后您可以避免 ?
解包)
顺便说一下,这不是内存泄漏,而是另一种类型的问题:https://en.wikipedia.org/wiki/Memory_leak
因此,我的目标是在实例化右侧时解决此条件问题 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(又名其他类型用户的 viewController)。
这并不是说在生产环境中学生用户只能访问学校用户的帐户并像在同一场景会话中那样登录,但安全总比后悔好。所以这导致我问,这是内存泄漏还是完全不同的问题?
我也遇到这个错误:
您的查询基于变量 actualuser
,看起来它只设置了一次,即在首次设置场景时。在状态更改回调中,它永远不会更新。
因此,当您注销,然后以其他用户身份重新登录时,将使用 actualuser
的初始值,这解释了为什么您会看到错误的视图控制器。然后,当您再次 运行 应用程序并设置场景时, actualuser
再次设置为 auth().currentUser ,向您显示正确的视图控制器。
此处的解决方案是根据当前(和当前)用户进行查询。
类似于:
db.document("student_users/\(user.uid)")
(而不是检查 user != nil
,使用 let user = user
进行可选绑定,然后您可以避免 ?
解包)
顺便说一下,这不是内存泄漏,而是另一种类型的问题:https://en.wikipedia.org/wiki/Memory_leak