NSUserDefaults存储失败原因及解析
来源:互联网 发布:mac如何更新系统版本 编辑:程序博客网 时间:2024/05/21 11:00
问题背景:
在项目中,有个需求,判断是否是第一次打开APP进行记录,从而决定是否需要展示引导页面。这本是一个比较常见的功能,并且在本次改版升级之前,此功能并没有出现问题,但是这次却出现了一个现象:在运行项目的时候,比较频繁的会出现判断失误,导致APP的流程出现意外的拐点,从而让下面的功能受到影响。
一开始的时候我并没有注意到,我以为是同一账号在两台设备上登录以后导致的(APP有个防止两台设备登录同一账号的功能),后经测试发现,并不是。so strange……
原因分析:
在排除受到 防异地登录 功能的影响后,我在AppDelegate.m文件里面找到了原因。如下图
对于NSUserDefaults的使用,就不在多介绍了,但是它有一个机制,就是在执行完 [defaults setValue:value forKey:key];代码之后,并不是立即将对应的值进行存储的,根据官方API的解释“The synchronize method, which is automatically invoked at periodic intervals, keeps the in-memory cache in sync with a user’s defaults database.”,是根据时间戳定时的把缓存中的数据写入到沙盒中。有了这个机制,所以才会出现在某种情况下会出现存值失败的情况。
解决办法:
其实办法很简单,我们让所要存储的值即时写入到沙盒就OK了,所以我们在调用的setValue方法之后就要把value立马写入,避免出现问题,所以就用到了 synchronize 这个方法。在NSUserDefaukts使用到最后,及时把数据手动写入。
总结:
以前使用NSUserDefaults的时候没出现过数据存取的问题,因为它的使用便捷性,也就没有过多去了解它的内部机制,一直以为是setValue之后就立即写入的。这次的小坑也是很尴尬呀……简单也好,复杂也好,背后的东西还是很多的,学无止境吧……
最近总是被小坑绊住,是时候醒醒脑了……
阅读全文
1 0
- NSUserDefaults存储失败原因及解析
- iOS解决NSUserDefaults存储失败问题
- NSUserDefaults 存储类型 及存储对象
- NSUserDefaults 存储类型 及存储对象
- malloc realloc失败原因解析
- NSUserDefaults 数据存储及自定义对象的存储
- 本地存储 之 NSUserDefaults 及NSUserDefaults对存储对象的封装
- wget失败原因及解决方案
- C++Test静态分析时,抛出”解析文件失败”错误的原因及解决方法
- 备份失败的五大原因解析
- PHP json_decode返回null解析失败原因
- PHP json_decode返回null解析失败原因
- PHP json_decode返回null解析失败原因
- insert/update操作失败原因及解决方法
- bjam编译boost失败及原因
- linux smartd启动失败原因及解决方法
- ghost恢复失败的原因及解决方法
- Android权限及chown失败原因查找
- LeetCode_AlgorithmProblem01,TwoSum
- iOS 模仿腾讯新闻首页,指示条及顶部滚动条效果
- php发送短信(调用网易云信实现)
- 碎屑
- R语言中两表连接且输出不重复数据
- NSUserDefaults存储失败原因及解析
- mysql授权GRANT ALL PRIVILEGES
- tomcat 启动
- Android 自定义进度条
- android 向后台传中文时出现乱码
- php实现发送微信模板消息的方法
- win7(64位)彻底卸载mysql,重装不再烦恼
- java 系列: 动态代理(上)
- python实现队列 FIFO