2

我有一个登录视图控制器,用户可以在其中输入他们的偏好,例如是否要激活某些 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即时快速的吗?或者它是滞后的,应该善待使用?

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

感谢大家!

4

3 回答 3

8

你的代码很好。在您真正遇到问题之前,不要担心此类优化。智能实现的信任UserDefaults(因为它是)。设置像Boolin这样简单的东西并没有什么“滞后”的UserDefaults

您还希望查看与此问题相关的另一个答案:何时以及为什么要使用 NSUserDefaults 的 synchronize() 方法?

于 2018-02-12T21:55:39.230 回答
2

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

于 2018-02-12T21:56:33.247 回答
1

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

于 2018-02-12T22:08:49.947 回答