持久化存储---归档一

一、流程图

二、代码

1.模型归档

(1)

复制代码
@interface Person : NSObject<NSCoding>//归档调用的方法
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeObject:self.address forKey:@"adress"];
    [aCoder encodeObject:self.photo forKey:@"photo"];
}
//反归档调用的方法
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) { 
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.address = [aDecoder decodeObjectForKey:@"adress"];
        self.photo = [aDecoder decodeObjectForKey:@"photo"];
    }
    return self;  
}
+ (NSString *)getTheFilePath:(NSString *)filePath{
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:filePath];
    return path;
}
复制代码

(2)

复制代码
    //1.归档类名:NSKeyedArchiver,解归档类名:NSKeyedUnarchiver
    //2.归档和解档的类必须遵守<NSCoding>,且必须实现- (void)encodeWithCoder:(NSCoder *)aCoder(归档,字段写入)和- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder(返归档的方法,根据key解出)
    //3.定义归档路径
    //4.调用归档和解档的方法
//---------归档与解档一,存储模型,
 //归档
    //1.存储的路径
    //2.存储后的对象数据
    //3.创建归档工具
    //4.将对象按指定路径归档

    NSString *arcHome = [Person getTheFilePath:@"arcHome.archiver"];

    Person *person = [[Person alloc] init];
    person.name = @"";
    person.age = [@28 integerValue];
    person.address = @"以色列";
    person.photo = [UIImage imageNamed:@"Snip20170215_1"];

  
BOOL isSucces
= [NSKeyedArchiver archiveRootObject:person toFile:arcHome]; if (isSucces) { NSLog(@"%@",arcHome); } //解档 Person *persons = [NSKeyedUnarchiver unarchiveObjectWithFile:arcHome]; NSLog(@"name=%@age=%ldadress=%@photo=%@",persons.name,persons.age,persons.address,persons.photo);
复制代码

2.数组及字典其它方式归档

  

复制代码
//---------归档与解档三,存储数组或字典
    //1.存取的数据
    //2.存取的路径
    //3.准备存储数据的对象如NSMutableData
    //4.创建归档,开始归档对象,完成归档
    //5.写入文件中
    Person *students = [Person new];
    students.name = @"zi";
    students.age = [@18 integerValue];
    students.address = @"shanghai";
    students.photo = [UIImage imageNamed:@"1.png"];
    
    NSString *dataPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"dataPath.archiver"];
    
    NSMutableData *data = [NSMutableData data];
    
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:students forKey:@"archiver"];
    [archiver finishEncoding];
    
    BOOL result = [data writeToFile:dataPath atomically:YES];
    if (result) {
        NSLog(@"写入成功");
    }else{
        NSLog(@"写入失败");
    }
    
    //----解档
    //1.准备解档路径,根据存储路径来返回Data
    //2.创建反归档对象
    //3.反归档
    //4.完成反归档
    NSData *studentData = [NSData dataWithContentsOfFile:dataPath];
    NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc] initForReadingWithData:studentData];
    Person *stu = [unarch decodeObjectForKey:@"archiver"];
    [unarch finishDecoding];
    
    NSLog(@"student-->%@--%ld--%@--%@",stu.name,stu.age,stu.address,stu.photo);
复制代码

 

posted @   TheYouth  阅读(257)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示