美文网首页数据储存
iOS 数据存储(二) -持久化 NSKeyedArchiver

iOS 数据存储(二) -持久化 NSKeyedArchiver

作者: 搬砖的crystal | 来源:发表于2022-07-21 16:24 被阅读0次

    一、简介

    归档

    当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流 NSData 类型数据,再通过写入文件来进行存储。

    反归档

    字节流转换为字典,数组,自定义的类等。

    缺点

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

    使用场景
    • 有些应用支持一个离线缓存,也就是说当手机没联网时,可以将手机有网时的数据存放在本地,当手机没网时,从本地中取出来这些数据展示。
    • 电商场景中,可以缓存用户搜索历史记录。

    二、使用

    1.系统对象进行归档
        //已字典为例
        NSDictionary *dict=@{@"name":@"xiaoBai",@"age":@"25",@"sex":@"man"};
        
        //归档
        NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *dataPath = [docPath stringByAppendingPathComponent:[NSString stringWithFormat:@"data.plist"]];
        NSError *error;
        NSData* data = [NSKeyedArchiver archivedDataWithRootObject:dict requiringSecureCoding:NO error:&error];
        [data writeToFile:dataPath atomically:YES];
        //解档
        NSData* unData = [NSData dataWithContentsOfFile:dataPath];
        NSDictionary *unDict = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] fromData:unData error:&error];
        NSLog(@"%@",unDict);
    
    2.自定义对象

    归档自定义对象该对象必须实现 NSCodingNSSecureCoding 协议,并重写以下几、个方法:

    -(void)encodeWithCoder:(NSCoder *)aCoder;
    - (id)initWithCoder:(NSCoder *)coder;
    + (BOOL)supportsSecureCoding;//返回yes
    

    示例代码:

    #import <Foundation/Foundation.h>
    
    @interface DJModel : NSObject
    @property (nonatomic, copy) NSString *name;
    @end
    
    #import "DJModel.h"
    
    @interface DJModel ()<NSCoding,NSSecureCoding>
    
    @end
    
    @implementation DJModel
    /**
    当将一个自定义对象保存到文件的时候就会调用该方法
     */
    -(void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeObject:_name forKey:@"name"];
    }
    
    /**
     当从文件中读取一个对象的时候就会调用该方法
     */
    - (id)initWithCoder:(NSCoder *)coder {
        if(self = [super init]) {
            _name = [coder decodeObjectForKey:@"name"];
        }
        return self;
    }
    /**
    声明了它可以处理本身实例的编码解码方式,以防止替换攻击
     */
    + (BOOL)supportsSecureCoding {
        return YES;
    
    }
    @end
    

    归档解档:

        DJModel *model = [[DJModel alloc]init];
        model.name = @"dj";
        //归档
        NSString *modelPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:[NSString stringWithFormat:@"model.data"]];
        NSError *error;
        NSData* modelData = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:NO error:&error];
        [modelData writeToFile:modelPath atomically:YES];
        //解档
        NSData* unModelData = [NSData dataWithContentsOfFile:modelPath];
        DJModel *unModel = (DJModel *)[NSKeyedUnarchiver unarchivedObjectOfClass:[DJModel class] fromData:unModelData error:&error];
    

    相关文章

      网友评论

        本文标题:iOS 数据存储(二) -持久化 NSKeyedArchiver

        本文链接:https://www.haomeiwen.com/subject/ibvuirtx.html