iOS NSUserDefaults synchronize存储

作者: 择势量投 | 来源:发表于2019-01-24 15:07 被阅读27次

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: 存取图片或自定义对象,不会存在延迟问题。

相关文章

网友评论

    本文标题:iOS NSUserDefaults synchronize存储

    本文链接:https://www.haomeiwen.com/subject/htayjqtx.html