在iOS上访问NSUserDefaults被认为是便宜的吗?

use*_*109 5 nsuserdefaults ios

简而言之:快速/便宜吗?将NSUserDefaults中的值存储在内存中以便更快地访问是否有意义?

更长:说,我有大量的值要存储和读取NSUserDefaults; 需要经常访问(读取)这些值.

在下面的代码片段中,我初始化一个私有存储属性,并保持与相应的NSUserDefaults值同步 - 所以当我需要读取它时,我读取了属性.

如果直接读取默认值实际上很快,我显然会删除私有财产.但我不确定.它快吗?

private var _loggedIn = NSUserDefaults.standardUserDefaults().boolForKey("loggedIn")
public var loggedIn: Bool {
    get {
        return _loggedIn
    }
    set {
        _loggedIn = newValue
         NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "loggedIn")
         NSUserDefaults.standardUserDefaults().synchronize()
    }
}
Run Code Online (Sandbox Code Playgroud)

对未来读者的澄清:问题是关于阅读,而不是写作/同步,这是(如答案中所指出的)不快速也不便宜.

.synchronize()在setter中调用是有正当理由的 - 在我的特定情况下,让它立即同步是很重要的,所以我牺牲性能来保持逻辑完整性.在一般情况下,您应该考虑是否需要调用它 - 或者让系统选择适当的写入时间.

..In事实上,现在我看,我看到保持存储的属性,因为它是在片段中,将提供逻辑完整性(从其他地方只要获得通过吸气发生,从userDefaults不是直接).所以我也可以synchronizing在这里避免.

Mir*_*rek 8

阅读很便宜.有一个慷慨的缓存,一切都发生在RAM中.变异相对便宜,但系统仍然必须定期将内容存储到非易失性存储器(闪存上的.plist文件).

显式同步并不便宜.它吃的时间和能量.

因此对于读取它很好,但是通过大量写入,我仍然可以在单独的容器中进行,并且仅在需要时进行序列化.