iOS开发 数据存储之NSKeyedArchiver

NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码

1.先定义一个Person类

Person.h文件中

@interface Person : NSObject<NSCoding>

@property (nonatomic, assign) NSInteger pId;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSString *sex;
@property (nonatomic, assign) CGFloat height;
/**保存路径*/
+ (NSString *)personPath;
@end

Person.m文件中

// 当将一个自定义对象保存到文件的时候就会调用该方法
// 在该方法中说明如何存储自定义对象的属性
// 也就说在该方法中说清楚存储自定义对象的哪些属性
/**协议方法-对数据进行序列化*/
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:@(self.pId) forKey:@"person_id"];
    [aCoder encodeObject:self.name forKey:@"person_name"];
    [aCoder encodeObject:@(self.age) forKey:@"person_age"];
    [aCoder encodeObject:self.sex forKey:@"person_sex"];
    [aCoder encodeObject:@(self.height) forKey:@"person_height"];
}
// 当从文件中读取一个对象的时候就会调用该方法
// 在该方法中说明如何读取保存在文件中的对象
// 也就是说在该方法中说清楚怎么读取文件中的对象
/**协议方法-对数据进行反序列化并读取*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.pId = [[aDecoder decodeObjectForKey:@"person_id"] integerValue];
        self.name = [aDecoder decodeObjectForKey:@"person_name"];
        self.age = [[aDecoder decodeObjectForKey:@"person_age"] integerValue];
        self.sex = [aDecoder decodeObjectForKey:@"person_sex"];
        self.height = [[aDecoder decodeObjectForKey:@"person_height"] floatValue];
    }
    return self;
}
#pragma mark - 保存路劲
+ (NSString *)personPath
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"person"];
    return path;
}

2.归档操作:

如果对Person对象归档保存,只需要调用NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:即可

// 先定义Person对象
Person *person = [[Person alloc] init];
person.pId = 1;
person.name = @"Jack";
person.age = 23;
person.sex = @"男";
person.height = 187.0;
// 保存路劲
NSString *path = [Person personPath];
[NSKeyedArchiver archiveRootObject:person toFile:path];

3.解压操作:

如果对Person对象解压操作,只需要调用NSCoder子类NSKeyedUnarchiver的方法unarchiveRootObject:toFile:即可

NSString *path = [Person personPath]; // 根据路劲解压数据
[NSKeyedUnarchiver unarchiveObjectWithFile:path];

4.删除数据:

NSString *path = [Person personPath]; // 根据路劲删除数据
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];

5.特点:

1)易用性较强

2)数据存储archive文件中

3)一般用于存储少量数据

6.缺点:

归档的形式来保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 中,你可以使用以下两种方式将接口返回的数据缓存到本地: 1. 使用 NSUserDefaults 如果你的数据量比较小,可以将接口返回的数据存储NSUserDefaults 中。NSUserDefaults 是一个轻量级的本地存储工具,可以用来存储简单的用户配置信息和小数据量的数据。 你可以将接口返回的数据转换成 NSData 类型,然后存储NSUserDefaults 中。示例代码如下: ```objective-c // 将接口返回的数据转换成 NSData 类型 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject]; // 存储NSUserDefaults 中 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:data forKey:@"cachedData"]; [defaults synchronize]; ``` 在读取数据时,你可以使用如下代码: ```objective-c // 从 NSUserDefaults 中读取数据 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [defaults objectForKey:@"cachedData"]; // 将 NSData 类型转换成 NSDictionary 类型 NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; ``` 2. 使用文件缓存 如果你的数据量比较大,可以将接口返回的数据存储到文件中。在读取数据时,你可以从文件中读取数据。示例代码如下: ```objective-c // 将接口返回的数据转换成 NSData 类型 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject]; // 存储到文件中 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"cachedData"]; BOOL success = [data writeToFile:filePath atomically:YES]; if (!success) { NSLog(@"Error writing to file"); } ``` 在读取数据时,你可以使用如下代码: ```objective-c // 从文件中读取数据 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"cachedData"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; // 将 NSData 类型转换成 NSDictionary 类型 NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; ``` 注意:无论你选择哪种方式,都需要注意缓存的有效期。在读取数据时,你需要判断缓存是否过期,如果过期了,就需要重新从接口获取数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值