Swift - 这段代码是错误的还是我应该使用 UserDefaults?
Swift - Is this code wrong or should I use UserDefaults?
我有一个连接到 Firebase 的应用程序,您可以使用 Google 和 Facebook 登录。该应用程序有一个主屏幕,当用户登录时加载。如果用户之前已经登录,我不想显示登录屏幕。所以我在主屏幕中使用这段代码来检查用户是否登录。主屏幕是应用程序中的初始视图控制器
override func viewDidAppear(_ animated: Bool) {
if Auth.auth().currentUser != nil{
// user is signed in
}else{
// No user is signed in.
performSegue(withIdentifier: "login", sender: nil)
}
}
此代码运行良好。我知道,我也可以使用 UserDefaults,但这似乎是一种更简单的方法。这是错误的还是我应该使用 UserDefaults?
但唯一的问题是,很快就会显示主屏幕,然后执行 segue 到登录屏幕,我猜这是因为它在 viewdidApepar 方法中,所以代码在之后执行viewcontroller 出现了。你知道解决办法吗?
这是我个人做的,AppDelegate 中的 didFinishLaunchingWithOptions。
if UserManager.sharedManager.currentUser != nil {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
} else {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Login", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
}
当然我有一个 UserManager 来处理用户是否登录。(UserManager:NSObject)
var currentUser: User? {
return User.unarchiveStoredUser()
}
用户与解码器一起存储到 UserDefautls 中,然后取消存档以验证用户是否登录(用户:NSObject)
func archiveUser() {
let data = NSKeyedArchiver.archivedData(withRootObject: self)
UserDefaults.standard.set(data, forKey: "userIdentifier")
UserDefaults.standard.synchronize()
}
class func unarchiveStoredUser() -> User? {
if let data = UserDefaults.standard.object(forKey: "userIdentifier") as? Data {
let user = NSKeyedUnarchiver.unarchiveObject(with: data) as! User
return user
}
return nil
}
希望对您有所帮助。
我有一个连接到 Firebase 的应用程序,您可以使用 Google 和 Facebook 登录。该应用程序有一个主屏幕,当用户登录时加载。如果用户之前已经登录,我不想显示登录屏幕。所以我在主屏幕中使用这段代码来检查用户是否登录。主屏幕是应用程序中的初始视图控制器
override func viewDidAppear(_ animated: Bool) {
if Auth.auth().currentUser != nil{
// user is signed in
}else{
// No user is signed in.
performSegue(withIdentifier: "login", sender: nil)
}
}
此代码运行良好。我知道,我也可以使用 UserDefaults,但这似乎是一种更简单的方法。这是错误的还是我应该使用 UserDefaults?
但唯一的问题是,很快就会显示主屏幕,然后执行 segue 到登录屏幕,我猜这是因为它在 viewdidApepar 方法中,所以代码在之后执行viewcontroller 出现了。你知道解决办法吗?
这是我个人做的,AppDelegate 中的 didFinishLaunchingWithOptions。
if UserManager.sharedManager.currentUser != nil {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
} else {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Login", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
}
当然我有一个 UserManager 来处理用户是否登录。(UserManager:NSObject)
var currentUser: User? {
return User.unarchiveStoredUser()
}
用户与解码器一起存储到 UserDefautls 中,然后取消存档以验证用户是否登录(用户:NSObject)
func archiveUser() {
let data = NSKeyedArchiver.archivedData(withRootObject: self)
UserDefaults.standard.set(data, forKey: "userIdentifier")
UserDefaults.standard.synchronize()
}
class func unarchiveStoredUser() -> User? {
if let data = UserDefaults.standard.object(forKey: "userIdentifier") as? Data {
let user = NSKeyedUnarchiver.unarchiveObject(with: data) as! User
return user
}
return nil
}
希望对您有所帮助。