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{

     //save data

    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的动作,以及时保存(修改了的)数据。

时间: 2024-08-29 06:58:27

NSUserDefaults偶尔/有时候保存数据会失败/失效的相关文章

hibernate4无法保存数据

hibernate4无法保存数据 author: hiu 以后都发文章我都备注一下作者了,hiu就是我了 红色字体更新日期:2014-07-08 初次使用hibernate4,使用getCurrentSession保存对象时无法将对象的数据保存进数据库,经过一番试验后,发现原来要配置事务才干保存数据. 保存数据失败原因: 没有配置事务,通过手动写一个事务,才干提交数据.手动写一个事务,用getCurrentSession也无法保存数据,仅仅能使用openSession才干保存数据. 解决的方法:

Android处理运行时变更保存数据状态恢复Activity

一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态. 为此,google提供了三种解决方案: 对于少量数据: 通过onSaveInstanceState(),保存有关应用状态的数据. 然后在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态. 对于大量数据:用

android产品研发(十)-->不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

不要在Application保存数据

引言: 总是有需要在很多地方在你的应用程序的一些信息.它可以是一个会话,一个昂贵的计算的结果,等,它通常是很诱人的让你避免Activity之间传递对象或保持那些在持久存储的开销. 有时候建议这个模式,这将是可用在所有Activity的Application对象.这个解决方案很简单,优雅......然后这个模式是完全错误的. 如果你认为你的数据将放在那里,那么你的应用程序将最终与一个NullPointerException异常崩溃 一个简单的案例: The Application object:

Android学习笔记-保存数据的实现方法1

Android开发中,有时候我们需要对信息进行保存,那么今天就来介绍一下,保存文件到内存,以及SD卡的一些操作,及方法,供参考. 第一种,保存数据到内存中: //java开发中的保存数据的方式 public static boolean saveUserInfo(String username,String password){ File file = new File("/data/data/com.ftf.login/info.txt"); try { FileOutputStre

android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法

android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 09. 四 / android基础 / 没有评论 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状态数据,就可以保存到SharedPreferences 很简单的保存和获取方法.但很实用. itcast是xml的文件名

转---IOS 四种保存数据的方式!

在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码.例如对Possession对象归档保存.

tomcat cluster session同步时保存数据的问题

Tomcat Cluster官网:https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html(tomcat7.0) 场景: tomcat1 tomcat2    |            |--------|---------      nginx tomcat版本:7.0.59 1.后端应用为2台tomcat容器,并且配置了Tomcat Cluster:2.nginx为前端web服务器,负责反向代理和负载均衡(简单轮训),配置如下:

iOS 四种保存数据的方式!

在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码.例如对Possession对象归档保存.