美文网首页数据储存
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];

相关文章

  • NSKeyedArchiver简述

    1.1关于数据的持久化存储的几种方式 说到NSKeyedArchiver,也就先要了解下iOS开发中关于数据持久...

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

    一、简介 归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流 NSData ...

  • iOS数据持久化方式

    iOS数据持久化方式 文件 归档(NSKeyedArchiver) 属性列表(NSUserDefaults) 数据...

  • iOS开发 数据持久化方式及应用

    iOS数据持久化方式可分为三种:如下图 归档存储 NSKeyedArchiver 对象要实现NSCoding协议,...

  • iOS数据持久化存储-NSKeyedArchiver

    归档(称为序列化)是把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通...

  • iOS数据存储(一)

    iOS开发常用的数据持久化方式有NSUserdefaults(属性列表),NSKeyedArchiver(归档/解...

  • iOS数据持久化

    Title: iOS数据持久化 ##数据持久化概念 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型...

  • iOS数据存储

    iOS数据存储 持久化存储 概述: 持久化存储——将数据保存在硬盘里,当应用程序重启后可以访问到之前存储的数据。是...

  • NSKeyedArchiver归档

    NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪...

  • ios的数据持久化

    一、what 数据持久化,就是数据存储。 二、iOS数据存储的方式 有5中方式 plist文件(XML属性列表) ...

网友评论

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

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