iOS - NSUserDefaults 实现数据的持久化保存

司寇山
2023-12-01

前言

在开发的时候,我们经常会遇到一些场景,需要我们持久化保存一些数据。通常我们会将相对结构化的数据保存在远端或者本地的数据库中,而对于相对零散的变量数据,保存在数据库中是不太合适的。这时,接下介绍的这个方法就可以派上用场了~

NSUserDefaults 是一个系统提供的,主要用于应用数据永久保存的类,通常以单例的形式使用,可以通过 [NSUserDefaults standardUserDefaults] 来获取单例对象,它是线程安全的。

NSUserDefaults 的数据保存在应用沙盒的 Library/Preferences/ 目录下,并且以 .plist 文件的形式存在。

NSUserDefaults 的基本使用

支持保存的数据类型主要有,基本数据类型、NSNumber、NSString、NSArray、NSDictionary、NSDate、NSData等。如果想保存上面提到的以外的类型,就需要将其归档到 NSData 中进行存储,然后使用 NSUserDefaults 进行保存。

数据存储

// 基本类型数据的存储
[[NSUserDefaults standardUserDefaults] setInteger:1024 forKey:@"NSINTEGER"];
// 字符串存储
[[NSUserDefaults standardUserDefaults] setObject:@"iOS" forKey:@"NSSTRING"];
// 数组存储
NSArray *arr = @[@"C++", @"Java", "Pyhton"];
[[NSUserDefaults standardUserDefaults] setObject: forKey:@"NSARRAY"];

数据获取

// 基本类型数据获取
NSInteger integer = [[NSUserDefaults standardUserDefaults] integerForKey:@"NSINTEGER"];
// 字符串数据获取
NSString *str = [[NSUserDefaults standardUserDefaults] stringForKey:@"NSSTRING"];
// 数组数据获取
NSArray *arr = [[NSUserDefaults standardUserDefaults] arrayForKey:@"NSARRAY"];

删除数据

// 根据数据的 key 进行数据删除
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSINTEGER"];

自定义数据类型:

// 保存自定义类型数据
VGUser *user = [VGUser new];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"VGUser"];

// 移除自定义类型数据
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"VGUser"];

应用举例

这里举一个比较常用的 NSUserDefaults 应用例子,我们的 APP 在首次打开的时候,总会出现各种用户引导动画,它的展示时机是在用户首次打开 APP 时,引导动画在展示过后便不再出现,除非用户重写安装该 APP。

这个时候就可以用上 NSUserDefaults,在沙盒里保存一个 BOOL 类型的 isShowed 变量,当它为 NO 的时候,我们就展示引导动画,并将沙盒中的变量置为 YES,这就能保证引导动画在 APP 的一次安装中只展示一次。

// 沙盒中数据的 key
static NSString const *kUserGuidanceShowed = @"kUserGuidanceShowed";

- (void)showUserGuidanceAnimation {
	BOOL isShowed = [[NSUserDefaults standardUserDefaults] kUserGuidanceShowed];
	if (!isShowed) {
		[[NSUserDefaults standardUserDefaults] setBool:YES forKey:kUserGuidanceShowed];
		// show Animation
	}
}

写在最后

虽然 NSUserDefaults 能简单地帮助我们实现数据的持久化保存,但是滥用 NSUserDefaults 来保存大量的数据信息,反而会影响 APP 的启动速度。

 类似资料: