如何在Swift成功登录后最好地管理当前登录用户?

时间:2018-06-06 02:14:16

标签: swift

我有一个AuthService单例类来管理所有Auth服务(Facebook,Firebase登录等)。

目前,我使用UserDefaults存储核心当前登录用户属性,如下所示,以便通过应用程序使用。我还要求跟踪其他属性,如电子邮件,姓名,生日等。

管理当前登录用户的最佳实践方法是什么/ UserDefaults,Singleton用户类等?

    let defaults = UserDefaults.standard

var isLoggedIn : Bool {
    get {
        return defaults.bool(forKey: LOGGED_IN_KEY)
    }
    set {
        defaults.set(newValue, forKey: LOGGED_IN_KEY)
    }
}

var userName : String {

    get { return defaults.value(forKey: USER_NAME)  as! String }

    set { defaults.setValue(newValue, forKey: USER_NAME) }
}

var profileImgURL : String {

    get { return defaults.value(forKey: PROFILE_PIC_URL)  as! String }

    set { defaults.setValue(newValue, forKey: PROFILE_PIC_URL) }
}

1 个答案:

答案 0 :(得分:0)

使用用户默认值和单例类不是互斥的。关键是如何保存用户登录的状态。

首先如何处理LOGGED_IN_KEY标志?

如果将LOGGED_IN_KEY放在用户类下,则在保存整个User对象时,需要在init时添加编码器和解码器方法。

如果将LOGGED_IN_KEY设置为全局变量,则只需一个简单的用户默认设置值。

从设计角度来看,两者都是合理的。作为具有用户登录功能的应用程序,用户登录状态也可以视为基于应用程序的环境变量。但是,如果您的应用程序(普通应用程序执行此操作)只允许一个用户同时登录,那么将LOGGED_IN_KEY标志放在用户类下应该会使用户类成为单例。

用户默认值是最常用的方式,也是最简单的方式。删除应用程序时,也会删除用户默认保存的值。当用户重新安装应用程序时,它会启动一个新的应用程序并且没有任何关于LOGGED_IN_KEY的数据,然后请求登录,这是预期的情况。

其他替代方案包括使用CoreData,但这更像是一个数据库,还有更多的设置要做。当然,您可以将LOGGED_IN_KEY标志发送到您的远程服务器,并在用户打开应用程序时获取它,但是 这需要发出http请求并创建时间延迟。

因此,对于最快的解决方案,应该单独保存LOGGED_IN_KEY,因为它只需要一个键值对访问,而不是访问整个User对象。