NSUserDefaults的正确使用姿势

NSUserDefaults是一个使用非常频繁的持久化存储方式,使用过程中可能会遇到的两个问题:

  1. 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
  1. 不能及时同步导致的存储失败。
    NSUserDefaults为了速度和性能,默认只改变内存中的数据,而不是实时同步到本地文件。所以使用时有可能会出现偏好设置为存储到本地的情况。如果一些很重要的设置,希望立刻同步到本地,可以在设置完后手动调用[[NSUserDefaults standardUserDefaults] synchronize];立刻同步到本地,当然此操作如果过于频繁将会影响性能。如何避免“非重要”设置未能及时同步到本地呢?我们来帮app选一个合适的时机,比如APP终止,APP失活的时候,手动同步一下。虽然不知道系统是否已经做了这件事,自己再做一遍终究更放心。
//停止
-(void)applicationWillTerminate:(UIApplication *)application {
  [[NSUserDefaults standardUserDefaults] synchronize];
}
// 失活
-(void)applicationWillResignActive:(UIApplication *)application {
  [[NSUserDefaults standardUserDefaults] synchronize];
}

你可能感兴趣的:(NSUserDefaults的正确使用姿势)