init上的用户单例和nsuserdefault

时间:2015-02-12 22:29:47

标签: ios swift save singleton nsuserdefaults

我实际上有一个用户单例对象,其中填充了用户数据(名称,图片等)。

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

当我退出应用并重新启动时,单身初始化就像那样

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
}

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

1 个答案:

答案 0 :(得分: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。但这只是一种分组信息和减少关键冲突的方法。