iOS 数据存储(四) -持久化 NSUserDefault
一、简介
NSUserDefault
是单例的,并且是线程安全的,是以键值对的形式保存在沙盒中,最下面还是用 plist
文件进行保存。
当系统调用 [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@""]
后系统会为用户在沙盒下的 Libray/Preferences
目录下创建 plist
文件,文件名为当前应用的 Bundle Identifier
即 [[NSBundle mainBundle] bundleIdentifier]
用户可以通过 NSUserDefaults
接口的参数获取到该文件夹下的数据。
因为 NSUserDefaults
存储的数据是写入到 plist
文件的,所以 NSUserDefaults
支持存储的数据有限,包括有
NSData
、NSString
、NSNumber
、NSDate
、NSArray
、NSDictionary
类型的数据。
二、使用
1.数据写入
通常使用 - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
来设置我们的值,但有些特殊的数据,
系统也提供了几个便利的设置值方法:
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
这里边有一个比较特殊的方法 -setURL:forKey
,你可以保存数据的本地地址而不需要直接保存完整数据。
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName
当我们设置数据后,系统并不会立即保存到本地,而是会在一个系统觉得恰当的时间点进行存储,如果我们需要立即存储的话需要调用 - (BOOL)synchronize;
方法来实现。
2.数据读取
通常我们调用 - (nullable id)objectForKey:(NSString *)defaultName;
方法来获取我们存储的数据,系统还为我们提供了一些特别的接口供我们使用:
- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
- (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
注意点:当我们存储的数据是可变类型时,读取后的数据将变为不可变类型。
3.数据变化监听
当我们的 NSUserDefaults
实例所存储的数据变更时,系统会发送 NSUserDefaultsDidChangeNotification
的通知,通知会返回当前更改的 NSUserDefaults
实例对象回来。所以当需要监听某个 NSUserDefaults
数据存储的数据变化时,可以添加该通知的观察者。