NSUserDefaults
是一个使用非常频繁的持久化存储方式,使用过程中可能会遇到的两个问题:
- key容易写错导致无法存储或读取失败。
我们队NSUserDefaults
新建分类NSUserDefaults+XYW
,然后在这个分类里,对偏好设置进行处理,对外只暴露读和取的方法,不用关心key是什么,和进行偏好设置的时候需要做什么。
@implementation NSUserDefaults (XYW)
#pragma mark - launchTimes
static NSString *const nightModelKey = @"nightModelKey";
-(BOOL)isNightModel{
return [[NSUserDefaults standardUserDefaults] boolForKey:nightModelKey];
}
-(void)setNightModel:(BOOL)night{
[[NSUserDefaults standardUserDefaults] setBool:night forKey:nightModelKey];
if (night) {
//改变偏好设置的时候,可以做一些其他的事情
[[NSNotificationCenter defaultCenter] postNotificationName:nightModelKey object:@(night)];
}
}
@end
- 不能及时同步导致的存储失败。
NSUserDefaults
为了速度和性能,默认只改变内存中的数据,而不是实时同步到本地文件。所以使用时有可能会出现偏好设置为存储到本地的情况。如果一些很重要的设置,希望立刻同步到本地,可以在设置完后手动调用[[NSUserDefaults standardUserDefaults] synchronize];
立刻同步到本地,当然此操作如果过于频繁将会影响性能。如何避免“非重要”设置未能及时同步到本地呢?我们来帮app选一个合适的时机,比如APP终止,APP失活的时候,手动同步一下。虽然不知道系统是否已经做了这件事,自己再做一遍终究更放心。
//停止
-(void)applicationWillTerminate:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 失活
-(void)applicationWillResignActive:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] synchronize];
}