在实际开发中,出现类似于像Android持久化数据存储SharedPreferences以保存数据,具体实现思路是利用NSKeyedArchiver进行归档对象存储。
DataSaveUtil.h
#import <UIKit/UIKit.h>
@interface DataSaveUtil : NSObject
+(instancetype)datasave;
// 保存int数据
-(void)saveDateWithKeyAndIntValue:(NSString *)key intValue:(int)value;
// 保存int32数据
-(void)saveDateWithKeyAndInt32Value:(NSString *)key intValue:(int32_t)value;
// 保存int64数据
-(void)saveDateWithKeyAndInt64Value:(NSString *)key intValue:(int64_t)value;
// 保存float数据
-(void)saveDateWithKeyAndFloatValue:(NSString *)key floatValue:(float)value;
// 保存double数据
-(void)saveDateWithKeyAndDoubleValue:(NSString *)key doubleValue:(double)value;
// 保存bool数据
-(void)saveDateWithKeyAndBoolValue:(NSString *)key boolValue:(BOOL)value;
// 保存object数据
-(void)saveDateWithKeyAndValue:(NSString *)key value:(id)value;
// 读取int数据
-(int)readIntDataByKey:(NSString *)key defaultValue:(int)defaultValue;
// 读取int32数据
-(int32_t)readInt32DataByKey:(NSString *)key defaultValue:(int32_t)defaultValue;
// 读取int64数据
-(int64_t)readInt64DataByKey:(NSString *)key defaultValue:(int64_t)defaultValue;
// 读取float数据
-(float)readFloatDataByKey:(NSString *)key defaultValue:(float)defaultValue;
// 读取double数据
-(double)readDoubleDataByKey:(NSString *)key defaultValue:(double)defaultValue;
// 读取bool数据
-(BOOL)readBoolDataByKey:(NSString *)key defaultValue:(BOOL)defaultValue;
// 读取object数据
-(id)readObecjtDataByKey:(NSString *)key defaultValue:(id)defaultValue;
// 移除数据
-(BOOL)removeDataByKey:(NSString *)key;
@end
DataSaveUtil.m
#import <Foundation/Foundation.h>
#import "DataSaveUtil.h"
@interface DataSaveUtil()
@property(nonatomic, strong) NSString *documentPath;
@property(nonatomic, strong) NSString *filePath;
@end
@implementation DataSaveUtil
- (instancetype)init
{
self = [super init];
if (self) {
// 获取归档路径
self.documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
self.filePath = [self.documentPath stringByAppendingPathComponent:@"save_data"];
}
return self;
}
+ (instancetype)datasave{
static DataSaveUtil *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[DataSaveUtil alloc] init];
});
return instance;
}
- (void)saveDateWithKeyAndIntValue:(NSString *)key intValue:(int)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeInt:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndInt32Value:(NSString *)key intValue:(int32_t)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeInt32:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndInt64Value:(NSString *)key intValue:(int64_t)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeInt64:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndFloatValue:(NSString *)key floatValue:(float)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeFloat:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndDoubleValue:(NSString *)key doubleValue:(double)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeDouble:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndBoolValue:(NSString *)key boolValue:(BOOL)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeBool:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (void)saveDateWithKeyAndValue:(NSString *)key value:(id)value{
// 用来承载数据的NSMutableData
NSMutableData *data = [[NSMutableData alloc] init];
// 归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 运用encodeXXX方法归档数据
[archiver encodeObject:value forKey:key];
// 结束归档
[archiver finishEncoding];
// 写入数据(存储归档)
[data writeToFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key] atomically:YES];
}
- (int)readIntDataByKey:(NSString *)key defaultValue:(int)defaultValue{
int value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeIntForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (int32_t)readInt32DataByKey:(NSString *)key defaultValue:(int32_t)defaultValue{
int32_t value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeInt32ForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (int64_t)readInt64DataByKey:(NSString *)key defaultValue:(int64_t)defaultValue{
int64_t value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeInt64ForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (float)readFloatDataByKey:(NSString *)key defaultValue:(float)defaultValue{
float value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeFloatForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (double)readDoubleDataByKey:(NSString *)key defaultValue:(double)defaultValue{
double value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeDoubleForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (BOOL)readBoolDataByKey:(NSString *)key defaultValue:(BOOL)defaultValue{
BOOL value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeBoolForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (id)readObecjtDataByKey:(NSString *)key defaultValue:(id)defaultValue{
id value = defaultValue;
// NSMutableData用来承载解档出来的数据
NSMutableData *resultData = [[NSMutableData alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@_%@",self.filePath,key]];
// 解档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
if ([unArchiver containsValueForKey:key]) {
value = [unArchiver decodeObjectForKey:key];
}
// 结束解档
[unArchiver finishDecoding];
return value;
}
- (BOOL)removeDataByKey:(NSString *)key{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fpath = [NSString stringWithFormat:@"%@_%@",self.filePath,key];
if ([fileManager fileExistsAtPath:fpath]) {
// 移除数据
return [fileManager removeItemAtPath:fpath error:nil];
}
return NO;
}
@end