iOS下可以使用NSUserDefault、NSKeyedArchiver、sqlite、CoreData几种常用的方式来存储数据,其中NSUserDefaults是系统提供用来存储类似用户的配置等这些的数据,后两者用户存储大批量和比较复杂的数据。
NSUserDefault 基本上支持所有的原生数据类型NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等等。如果要存放非常规类型(如图片)或 自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。
通常为保证数据及时存储,我们会使用synchronize 立即同步磁盘的数据的, 这句在使用NSUserDefault会被自动调用,但是很可能不会立即就调用到,建议我们手动调用。
[[NSUserDefaults standardUserDefaults] synchronize];
其实即使调用了synchronize后,立即取值有时也会有取值失败的时候,尤其是在存储NSData类型的数据时。(可能是xcode调试的问题)
分析:
NSUserDefaults是单例的,同时也是线程安全的。synchronize存储使用了同步锁机制,如存储一张用户头像(图片较大),需要先转为NSdata,再存储,是有延迟的。若立即读取,有可能读取失败。
解决办法:
1、若较大的NSdata数据需要缓存到NSUserDefaults,建议不要立即读取的。
2、通过在使用的类中定义一个属性或 静态字典等临时存储。
static NSMutableDictionary *DDUserHeaderImageDict; //!<静态字典
直接是对静态字典进行操作,直接setValue:forKey: 存取图片或自定义对象,不会存在延迟问题。
网友评论