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

一、简介

归档

当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流 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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容