iOS数据持久化-归档NSKeyedArchiver

归解档操作(NSKeyedArchiver/NSKeyedUnArchiver)通过对自定义对象进行操作。归解档后的自定义对象很方面进行持久化操作,方便于对象以文件的形式进行存储。归解档的对象需要实现NSCoding协议。

1、自定义对象实现NSCoding协议


@interface UserModel : NSObject<NSCoding>


@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,assign)BOOL sex;

@end

#import "UserModel.h"

@implementation UserModel

//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{
    
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeBool:self.sex forKey:@"sex"];
    
}
//解档
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{

    if([self init]){
    
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.sex = [aDecoder decodeBoolForKey:@"sex"];
    }
    return  self;
}

2、使用NSKeyedArchiver进行对象归档

- (void)persistArchived{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *filePath = [path stringByAppendingPathComponent:@"user.data"];
    UserModel *user =[[UserModel alloc]init];
    user.name = @"zhangsan";
    user.age= 50;
    user.sex = NO;
    //调用NSKeyedArchiver 工厂方法实现归档:
    [NSKeyedArchiver archiveRootObject:user toFile:filePath];
   //解档:从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile:。
    UserModel *unarchiverUser = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    
    NSLog(@"unarchiverUser-name%@,unarchiverUser-name%d, unarchiverUser-age%ld", unarchiverUser.name, unarchiverUser.sex, unarchiverUser.age);
}

如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。  [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;

建议对象也同时实现NSCopying协议,该协议允许复制对象,要实现NSCopying协议须实现 -(id)copyWithZone:(NSZone *)zone 方法 。

保存的文件的扩展名可以任意指定。

  • 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
发出的红包

打赏作者

house.zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值