NSKeyedArchiver/NSKeyedUnarchiver归档应用(缓存实现)
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归档应用(缓存实现)的更多相关文章
- IOS NSKeyedArchiver(归档存取数据)
		
如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...
 - 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)
		
========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...
 - 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
		
在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...
 - iOS - OC NSKeyedArchiver		数据归档
		
前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...
 - iOS - Swift NSKeyedArchiver		数据归档
		
前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...
 - NSKeyedArchiver数据归档
		
前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...
 - NSKeyedUnarchiver归档
		
把自定义的类对象编码到NSData中 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:bc];//归档,bc是一个自定义的类对象, ...
 - iOS数据持久化存储之归档NSKeyedArchiver
		
归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简 ...
 - 使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档
		
一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序 ...
 
随机推荐
- UVa 10137 & ZOJ 1874  The Trip
			
题目大意:n个学生去旅行,旅行中每个学生先垫付,最后平摊所有费用,多退少补,并且支出差距控制在1分钱以内,求最小的交易金额. @2013-8-16 以前在zoj做过,把原来的代码直接提交了,虽然AC了 ...
 - tomcat 修改网站路径(Java之负基础实战)
			
1.找到server.xml 在tomcat安装路径/conf/server.xml 2.搜索webapps 添加 <Context path="" docBace=&quo ...
 - PHP新手之学习类与对象(4)
			
五.范围解析操作符(::) 范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员.方法和常量,还可以用于覆盖类中的成员和方法. 当在类的外 ...
 - RAC 开启gsd和oc4j服务
			
Oracle 11g RAC中,发现oc4j以及gsd服务都处于offline状态,这是Oracle 11g RAC默认情形.即便如此,并不影响数据库的使用,因为 oc4j 是用于WLM 的一个资源, ...
 - #DP# ----- OpenJudge最大子矩阵
			
OpenJudge 1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
 - oracle存储过程返回结果集
			
http://www.2cto.com/database/201204/127180.html oracle实现存储过程返回查询结果集合的方法 --实现存储过程返回查询结果集合的方法 ,以下代码来 ...
 - 如何快速定位到Eclipse自动添加的TODO
			
把自动生成的// TODO ....前面加上todo,这样生成之后就会有编译错误,直接 ctrl+. 就到该位置了,可以删除todo留着// TODO ...,也可以ctrl+d删除一行: 不建议不生 ...
 - delphi BitmapCompress
			
unit Unit2; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Va ...
 - Linux笔记(十四) - 日志管理
			
(1)rsyslogd的服务:查看服务是否启动:ps aux | grep rsyslogd 查看服务是否自启动:chkconfig --list | grep rsyslog 配置文件 : /etc ...
 - wx小程序初体验
			
小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxado ...