数据储存

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

2022-07-21  本文已影响0人  搬砖的crystal

一、简介

归档

当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流 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];
上一篇 下一篇

猜你喜欢

热点阅读