Swift - 这段代码是错误的还是应该使用 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
}

希望对你有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章