【已解决】NSUserDefaults偶尔/有时候保存数据会失败/失效
【问题】
之前已经实现了通过NSUserDefaults去保存用户数据:
【已解决】iPhone/iOS中保存自定义对象(Custom Object/Custom Class)的数组(NSMutableArray/NSArray)到NSUserDefaults
以便程序退出后,下次重新打开,加载之前的数据。
但是现在继续调试的过程中,发现一个问题,那就是,有时候NSUserDefaults保存数据没成功,偶尔会失败,导致对于程序数据的改动,没有保存,重启app,改动失效,还是改动之前的效果。
比如,本来当前的列表是:
改动后变为:
对应内部的数据,已调用setObject:forKey:去保存到NSUserDefaults了。
但是关闭app后再重启,发现改动失效了,还是改动之前的效果:
但是更奇怪的是,去调试了很多次,结果偶尔发现,此改动是可以生效的,即修改后的数据,又是成功的保存到了NSUserDefaults。
【解决过程】
1.调试了很多次,期间,遇到很多很是无语的事情,Xcode中的调试功能,不是一般的垃圾啊。
想看个当前变量的值,结果却无法直接查看。
总之,Xcode的调试功能,真尼玛太垃圾了。
详细过程,参考:
【整理】Xcode中的调试功能,真尼玛太垃圾了!!!
2.最后经过折腾,在调试了半天后,突然想到,好像之前NSUserDefaults的官网介绍中,提到一个synchronize的问题。
所以就回去看:
NSUserDefaults Class Reference
然后找到了那句提示:
At runtime, you use an NSUserDefaults
object to read the defaults that your application uses from a user’s defaults database. NSUserDefaults
caches the information to avoid having to open the user’s defaults database each time you need a default value. The synchronize
method, which is automatically invoked at periodic intervals, keeps the
in-memory cache in sync with a user’s defaults database.
所以,就又去看synchronize:
synchronize
Writes any modifications to the persistent domains to disk and updates all unmodified persistent domains to what is on disk.
- (BOOL)synchronize
Return Value
YES
if the data was saved successfully to disk, otherwise NO
.
Discussion
Because this method is automatically invoked at periodic intervals,
use this method only if you cannot wait for the automatic
synchronization (for example, if your application is about to exit) or
if you want to update the user defaults to what is on disk even though
you have not made any changes.
Availability
- Available in iOS 2.0 and later.
See Also
Related Sample Code
Declared In
NSUserDefaults.h
所以,就可以去代码中试试了。
3.添加了synchronize后,代码变为:
1
2
3
4
5
6
7
8
|
- (
void
)saveBirdSightingList{
NSData *encodedCurBirdSightingList = [NSKeyedArchiver archivedDataWithRootObject:self.masterBirdSightingList];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:encodedCurBirdSightingList forKey:@
"BirdSightingList"
];
[defaults synchronize];
}
|
然后结果就解决了NSUserDefaults偶尔不工作的问题。
每次新的改动的数据,都可以得到同步,所以即使程序立刻退出,则变动也可以得到及时保存。下次重启程序,则也可以恢复得到最新的数据了。
【总结】
NSUserDefaults偶尔不工作,无法保存改动的数据的原因是,NSUserDefaults的机制是,过一段时间,会自动调用自己的函数synchronize去同步数据的。
而如果你是遇到和我此处类似的,改动数据后,就退出程序了,即在NSUserDefaults还没来得及synchronize之前就退出程序,就需要手动调用synchronize去保存数据了。
即,在需要的时候,手动调用NSUserDefaults去执行同步synchronize的动作,以及时保存(修改了的)数据。
分享到:
相关推荐
在iOS开发中,`NSUserDefaults` 是一个非常常用的数据持久化工具,它主要用于存储用户的一些偏好设置或者轻量级的数据。当需要在应用的不同会话之间持久化数据,比如用户的登录状态、账号或密码等信息时,`...
当iOS应用进入后台模式时,系统会自动保存NSUserDefaults中的数据,以确保即使应用被杀死或设备重启,之前存储的数据仍然可用。因此,在用户离开应用时,无需特别处理数据保存,系统会自动处理。 五、注意事项 1. ...
当应用退出或系统重启时,NSUserDefaults中的数据会被自动保存到磁盘上,下次启动时加载。如果需要立即保存更改,可以调用`synchronize`方法: ```objective-c [defaults synchronize]; ``` 不过,通常情况下,无需...
这个源码Demo主要展示了如何使用`NSUserDefaults`来读取和写入自定义对象,这对于理解和实践iOS应用的本地数据持久化非常有帮助。 首先,`NSUserDefaults` 是苹果提供的一个轻量级的存储方案,它主要用于存储用户的...
`NSUserDefaults`类主要用于存储应用程序的默认设置或用户偏好数据,这些数据通常是键值对的形式。这些设置通常包括用户界面的偏好(如字体大小、颜色主题)、应用行为设置(如是否开启推送通知)等。`...
在iOS开发中,`NSUserDefaults` 是一个至关重要的组件,它允许开发者存储并检索轻量级的用户偏好设置或应用状态数据。本教程针对初学者,将深入探讨`NSUserDefaults`的基本用法,包括如何设置、读取值以及如何持久化...
NSUserDefaults是iOS开发中一个非常重要的类,用于存储用户的基本偏好设置和轻量级的数据。它提供了简单的方法来读取和写入数据,这些数据在应用的生命周期内保持持久化,并在用户下次打开应用时仍然可用。这个教程...
例如,可以结合使用Core Data存储核心业务数据,用NSUserDefaults保存用户偏好,而文件系统则用来处理媒体资源。通过这样的组合,能够充分利用各种数据持久化方式的优势,为用户提供稳定、高效的应用体验。 总结...
`NSUserDefaults`(用户默认值)是苹果提供的一种轻量级的数据存储解决方案,它允许开发者以键值对的形式保存简单类型的数据,如字符串、整数、布尔值、数组和字典等。这个压缩包"NSUserDefaults-记住密码.zip"包含...
iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefaults、SQLite3和Core Data NSUserDefaults官方文档介绍: NSUserDefaults类为和默认系统类交互提供了一种编程接口。默认系统允许应用程序去定制其行为...
NSUserDefaults + SevenSecurityLayers.h(已过时,不再维护) 为NSUserDefaults提供加密层以安全保存数据的类别。 使用强大的AES 356位加密####效益:*仅用一行代码保护用户数据。*支持混淆二进制源中的密钥*...
首先,`NSUserDefaults` 是Apple提供的一种轻量级的数据持久化方法,适合保存用户的偏好设置和少量数据。它并不适合大量数据的存储,因为其性能和数据结构有限。通常,我们使用它来存储诸如用户界面偏好、应用程序...
使用系统的NSUserDefaults进行存取值实在是难以对其进行统一管理,为此NSUserDefaultsModel就很好的解决了这一难题,并且还支持Cocoapods。 github地址:https://github.com/liuchongfaye/NSUserDefaultsModel ...
PAPreferences, 使用 @dynamic 访问 NSUserDefaults PAPreferences使用NSUserDefaults存储用户首选项的简便方法。PAPreferences将 dynamic 属性映射到 NSUserDefaults getter和 setter,以便访问默认值,就像它们是...
同时,也会有相关的测试代码来验证自定义对象能否正确地被保存到`NSUserDefaults`并在之后正确地读取出来。 总之,`NSUserDefaults`虽简单易用,但处理自定义对象时需要额外的序列化和反序列化步骤。理解这一过程...
`NSUserDefaults`虽然简单易用,但需要注意的是,它并不适合存储大量或复杂的数据结构,因为这些数据会被加载到内存中,可能会增加内存负担。此外,`NSUserDefaults`的数据是非加密的,敏感信息应避免直接存储。 在...
NSUserDefaults通常用于保存那些不需要频繁写入磁盘且数据量较小的信息,如用户首选项、游戏进度或应用程序的一些状态。它不适用于大量数据的持久化,因为它的设计目标是快速读取和写入小量数据。在iOS和macOS应用中...
1. **保存用户数据**:如果应用中存在未保存的数据,比如用户编辑的文本或者游戏进度,开发者应该在这里将它们持久化存储,可以使用`NSUserDefaults`、`CoreData`或文件系统。例如,如果数据存储在内存中的某个模型...
Akaibu是什么? 仅用一行代码即可归档任何类。 在后台自动映射类的属性。... dr这就是您需要知道的全部model.saveWithKey(key)//存档到NSUserDefaults //或Akaibu.saveWithKey(model,key)//存档
首先,iOS提供了多种方式来保存数据,包括NSUserDefaults、SQLite数据库、CoreData以及文件系统。本文的重点是文件系统,它是最基础的数据存储手段之一。通过文件系统,开发者可以直接读写文件,适用于大量文本、...