• NSKeyedUnarchiver : 从二进制流读取对象; NSKeyedArchiver :把对象写到二进制流中去。

  • 要实现对数据模型的归档,需要我们实现NScoding协议,(NScoping)(copy协议是为了模型数据可以复制,对于归档而言,不是必须要实现):

    • NScoder 和 NScoding:NScoding 是一个协议,而NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法
    • NScoding协议需要实现两个方法:
      -(void)encodeWithCoder:(NSCoder *)aCoder
      // 以keyValue形式对基本数据类型Encoding,从coder中读取数据,保存到相应的变量中,即反序列化数据
      -(id)initWithCoder:(NSCoder *)aDecoder
      // 以keyValue形式对基本数据类型Decoding,读取实例变量,并把这些数据写到coder中去。序列化数据,返回数据模型本身
  • KeyedArchiver能够保存这些类型的对象:NSArray, NSDictionary, NSDate, NSNumber, NSString, and NSData,是因为这些对象本身遵循了NSCoding.

NSCoding协议/NSKeyedArchiver结合将模型归档

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject<NSCoding>
/** name */
@property (nonatomic, retain) NSString *name;
/** ID */
@property (nonatomic, retain) NSString *ID; - (Student *)initWithName: (NSString *)newName andID: (NSString *)newID; @end

Student.m

#import "Student.h"

@implementation Student

- (Student *)initWithName:(NSString *)newName andID:(NSString *)newID {
self = [super init];
if (self) {
self.name = newName;
self.ID = newID;
}
return self;
} - (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.ID forKey:@"ID"];
} // 分别把两个属性变量根据关键字进行逆转码,最后返回一个Student类的对象
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.ID = [aDecoder decodeObjectForKey:@"ID"];
}
return self;
} @end

调用:

 	Student *stu1 = [[Student alloc]initWithName:@"124" andID:@"111"];//学生对象stu1
Student *stu2 = [[Student alloc]initWithName:@"223" andID:@"222"];//学生对象stu2
NSArray *stuArray =[NSArray arrayWithObjects:stu1,stu2, nil];//学生对象数组,里面包含stu1和stu2 NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stuArray];//归档
NSArray *stuArray2 =[NSKeyedUnarchiver unarchiveObjectWithData:stuData];//逆归档

NSUserDefault/NSKeyedArchiver结合实现本地缓存

  • NSUserDefault(偏好设置)

    • NSUserDefaults是一个单例,在整个程序中只有一个实例对象,而且不同于我们自己定义的单例,因为他不会随着这个程序的关闭而清除掉保存的数据,下次你开启程序,你之前保存的数据还是存在的,所以他可以用于本地数据的持久化,而且简单实用,我们也可以用来做为页面间的传值。
    • NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
    • NSUserDefaults保存的数据是不可变的,即使存入的是可变数组(字典),取出来的也是不可变的。
    • model的存储。
    • NSUserDefault需要注意点参考一下这个博客运用NSUserDefaults保存数据实现数据缓存
  • NSUserDefault/NSKeyedArchiver结合实现本地缓存:

    这是这几天项目里的缓存代码

    • HomeFrameHelper.h
#import <Foundation/Foundation.h>

@interface HomeFrameHelper : NSObject
+ (instancetype)sharedInstance;
/** frameArray */
@property (nonatomic, strong) NSMutableArray *homeFrameArray; - (NSMutableArray *)getHomeFrameModelFromLocal;
- (void)saveHomeFrameModelToLocal;
- (void)clear; @end
- HomeFrameHelper.m
#import "HomeFrameHelper.h"

static HomeFrameHelper *sharedInstance = nil;

@implementation HomeFrameHelper

+ (instancetype)sharedInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
} - (instancetype)init {
self = [super init];
if (self) { }
return self;
} - (NSMutableArray *)getHomeFrameModelFromLocal {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; id obj = [defaults objectForKey:HOME_FRAME_DEFAULT_ARRAY];
if (obj) {
return [NSKeyedUnarchiver unarchiveObjectWithData:obj];
}else {
return nil;
}
} - (void)saveHomeFrameModelToLocal {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.homeFrameArray];
[defaults removeObjectForKey:HOME_FRAME_DEFAULT_ARRAY];
[defaults setObject:data forKey:HOME_FRAME_DEFAULT_ARRAY];
[defaults synchronize]; // 同步
} - (void)clear {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:HOME_FRAME_DEFAULT_ARRAY];
[defaults synchronize]; self.homeFrameArray = nil;
} - (void)setHomeFrameArray:(NSMutableArray *)homeFrameArray {
_homeFrameArray = homeFrameArray;
} @end
- 调用:
    [HomeFrameHelper sharedInstance].homeFrameArray = dic2
[[HomeFrameHelper sharedInstance] saveHomeFrameModelToLocal];

NSKeyedArchiver/NSKeyedUnarchiver归档应用(缓存实现)的更多相关文章

  1. IOS NSKeyedArchiver(归档存取数据)

    如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...

  2. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  3. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  4. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  5. iOS - Swift NSKeyedArchiver 数据归档

    前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...

  6. NSKeyedArchiver数据归档

    前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...

  7. NSKeyedUnarchiver归档

    把自定义的类对象编码到NSData中 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:bc];//归档,bc是一个自定义的类对象, ...

  8. iOS数据持久化存储之归档NSKeyedArchiver

    归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简 ...

  9. 使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档

    一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序 ...

随机推荐

  1. C# TPL学习

    程序Ⅰ:通过Task类创建新线程 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  2. UVa 11450 - Wedding shopping

    题目大意:我们的朋友Bob要结婚了,所以要为他买一些衣服.有m的资金预算,要买c种类型的衣服(衬衫.裤子等),而每种类型的衣服有k个选择(只能做出一个选择),每个选择的衣服都有一个价格,问如何选择才能 ...

  3. MongoDB复制集环境搭建

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1853478 环境介绍 ...

  4. 【续】强行在C# Winform中渲染Cocos2d-x 3.6

    [前言] 上一篇讲了怎么把Cocos2d-x 3.6渲染进MFC窗体,这里来讲一下怎么在C# Winform中做到同样的功能.如果你不熟悉MFC的使用但对C# Winform比较在行,请往下看. 这一 ...

  5. swift webView的高度自适应内容

    废话不多 直接上代码 //在webView的协议方法里实现以下代码 func webViewDidFinishLoad(webView: UIWebView) {//加载完成 //        se ...

  6. Scrum

    Scrum[编辑] 维基百科,自由的百科全书   Scrum是一种敏捷软件开发的方法学,用于迭代式增量软件开发过程.Scrum在英语是橄榄球运动中争球的意思. 虽然Scrum是为管理软件开发项目而开发 ...

  7. void 0 === undefined

    http://www.cnblogs.com/fsjohnhuang/p/4146506.html

  8. PHP中的date函数中时区问题

    从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的,也就是显示的时间(无论用什么php命令)都是格林威治标准时间,所以才会有这个情况发生 解决方法如下 ...

  9. 框架基础:ajax设计方案(三)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组

    马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...

  10. [TPYBoard-Micropython之会python就能做硬件 3] 制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.TPYboard V102板  一块 2.DS3231 ...