是否可以经常访问NSUserDefaults / UserDefaults?

时间:2018-02-12 21:51:48

标签: ios swift nsuserdefaults swiftyuserdefaults

我有一个登录视图控制器,用户可以在其中输入他们的偏好,例如他是否要激活某些UI功能。

我将这些存储为getter和setter直接访问UserDefaults的变量,以下是其中一个的示例:

class Preferences {
        static var likesSpaghetti : Bool {
            set (likesSpaghetti) {
                UserDefaults.standard.set(likesSpaghetti, forKey: "likesSpaghetti")
            }

            get {
                return UserDefaults.standard.bool(forKey: "likesSpaghetti")
            }
        }
}

因此,每当我想设置其中任何一个时,我只需写下这样的东西:

Preferences.likesSpaghetti = false

现在,我的问题是:每次用户轻弹开/关开关时我都可以设置这些变量,还是应该将首选项保持为局部变量,然后才设置:

Preferences.likesSpaghetti = spaghettiSwitch.isOn

当用户离开loginViewController时? UserDefault的每次访问都是即时快速的吗?或是它是否滞后,应该仁慈地使用?

关闭此问题后进行编辑:所以我学会了不要过早地进行优化,并且在几十个元素的范围内可能没问题。所以我应该没事。每次用户修改任何内容时,我都会更新,以便我的代码更容易阅读和维护。

谢谢大家!

3 个答案:

答案 0 :(得分:5)

你的代码很好。在您真正遇到问题之前,不要担心这种优化。相信UserDefaults是巧妙实施的(因为它是)。没有什么"滞后"关于在Bool中设置UserDefaults之类的简单内容。

您还希望查看与此问题相关的另一个答案:When and why should you use NSUserDefaults's synchronize() method?

答案 1 :(得分:2)

实际上,userDefaults(它最初是 plist 文件)用于存储应用程序设置的目的,如果您需要配置其中的许多内容,创建变量的轻量级内容可能会占用内存,除了不直接将新设置更改反映到用户所做的默认设置之外,还可能导致在更改时发生不可预期的旧设置,例如本地化警报或检查相同设置的部分代码(例如推送通知回调)用户认为已经反映了

答案 2 :(得分:1)

同时添加@rmaddy @Sh_Khan,如果你考虑它的安全方面,NSUserDafault正是针对应用程序特定的细节,例如设置,首选项或一些对密码,用户名等安全性不敏感的配置建议不要在UserDefaults中存储敏感数据。您应该使用像这样的数据加密的钥匙串等服务。