初始化时的用户单例和 nsuserdefault

Posted

技术标签:

【中文标题】初始化时的用户单例和 nsuserdefault【英文标题】:User singleton and nsuserdefault at init 【发布时间】:2015-02-12 22:29:47 【问题描述】:

我实际上有一个用用户数据(姓名、图片等)填充的用户单例对象

这不是敏感数据,所以我将它们存储在会话中

当我退出应用并重新启动时,单例初始化是这样的

class var sharedInstance: User 
    struct Singleton 
        static var instance = User( firstName: NSUserDefaults.standardUserDefaults().objectForKey("firstName") as? String,
                                    lastName: NSUserDefaults.standardUserDefaults().objectForKey("lastName") as? String,
                                    email: NSUserDefaults.standardUserDefaults().objectForKey("email") as? String,
                                    profilPicture: NSUserDefaults.standardUserDefaults().objectForKey("profilPicture") == nil ?
                                        nil : UIImage(data: NSUserDefaults.standardUserDefaults().objectForKey("profilPicture") as NSData))
    

    return Singleton.instance

所以我想知道它是否存在这样的整洁解决方案? 或者我所做的也许是个好主意?

【问题讨论】:

我可能会稍微清理一下,通过删除一些重复的子表达式(例如,let defaults = NSUserDefaults.standardUserDefaults()),并将其全部放入存储在NSUserDefaults 或为用户实现NSCoding 并存储它,但是,是的,这是一种合理的方法。 让默认值?但是您将在哪里创建它?因为静态变量无法访问属性(并且对我的模型不好^^)。此外,可以将默认值创建为全局变量。你就是这么想的? 好吧,我建议不要让它成为单例,真的没有太多收获,只需将其作为您的 AppDelegate 的属性并传递它(或者感兴趣的人可以从那里获得它. 【参考方案1】:

您可以通过使用块初始化语法删除一些重复的子表达式和查找来稍微清理一下:

class var sharedInstance: User 
    struct Singleton 
        static var instance : User = 
            let defaults = NSUserDefaults.standardUserDefaults()
            let imageData = defaults.objectForKey("profilPicture") as? NSData

            let user =  User(
                firstName: defaults.objectForKey("firstName") as? String,
                lastName: defaults.objectForKey("lastName") as? String,
                email: defaults.objectForKey("email") as? String,
                profilPicture: imageData != nil ? UIImage(data: imageData!) : nil
            )
            return user
        ()
    

    return Singleton.instance

至于在NSUserDefaults 中存储此信息,这就是它的用途。所以,是的,这是一个合理的方法。根据您在那里存储的键的数量,通过将它们放入字典来对事物进行聚类可能会很有用,因此不要使用 4 个键来存储用户,而是创建一个包含 4 个键的字典,然后从NSUserDefaults。但这只是对信息进行分组并最大限度地减少关键冲突的一种方式。

【讨论】:

以上是关于初始化时的用户单例和 nsuserdefault的主要内容,如果未能解决你的问题,请参考以下文章

Struts2单例和多例

小测试

spring单例和非单例的问题

Java 单例和同步

枚举、单例和反序列化

Java单例---反射攻击单例和解决方法