我有一个登录视图控制器,用户可以在其中输入他们的偏好,例如他是否要激活某些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
的每次访问都是即时快速的吗?或是它是否滞后,应该仁慈地使用?
关闭此问题后进行编辑:所以我学会了不要过早地进行优化,并且在几十个元素的范围内可能没问题。所以我应该没事。每次用户修改任何内容时,我都会更新,以便我的代码更容易阅读和维护。
谢谢大家!
答案 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中存储敏感数据。您应该使用像这样的数据加密的钥匙串等服务。