经常访问NSUserDefaults/UserDefaults可以吗?

Is it fine to access NSUserDefaults/UserDefaults frequently?

我有一个登录视图控制器,用户可以在其中输入他们的首选项,例如他是否要激活某些 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

现在,我的问题是:我可以在每次用户轻按 on/off 开关时设置这些变量,还是应该将首选项表示为局部变量然后只设置:

Preferences.likesSpaghetti = spaghettiSwitch.isOn

当用户 segue 离开 loginViewController 时? UserDefault 的每次访问都是即时快速的吗?还是它很慢,应该仁慈地使用?

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

谢谢大家!

你的代码很好。在您真正遇到问题之前,不要担心此类优化。相信 UserDefaults 的实现很巧妙(因为它确实如此)。在 UserDefaults.

中设置像 Bool 这样简单的东西没有什么 "laggy"

您还希望查看我与此问题相关的另一个答案:

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

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