NSUserDefaults存储失败原因及解析

问题背景:

在项目中,有个需求,判断是否是第一次打开APP进行记录,从而决定是否需要展示引导页面。这本是一个比较常见的功能,并且在本次改版升级之前,此功能并没有出现问题,但是这次却出现了一个现象:在运行项目的时候,比较频繁的会出现判断失误,导致APP的流程出现意外的拐点,从而让下面的功能受到影响。
一开始的时候我并没有注意到,我以为是同一账号在两台设备上登录以后导致的(APP有个防止两台设备登录同一账号的功能),后经测试发现,并不是。so strange……

原因分析:
在排除受到 防异地登录 功能的影响后,我在AppDelegate.m文件里面找到了原因。如下图
NSUserDefaults存储失败原因及解析_第1张图片
对于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存储失败原因及解析_第2张图片

总结:
以前使用NSUserDefaults的时候没出现过数据存取的问题,因为它的使用便捷性,也就没有过多去了解它的内部机制,一直以为是setValue之后就立即写入的。这次的小坑也是很尴尬呀……简单也好,复杂也好,背后的东西还是很多的,学无止境吧……

最近总是被小坑绊住,是时候醒醒脑了……


你可能感兴趣的:(NSUserDefaults存储失败原因及解析)