缓存一条数据没啥意义 实际开发中一般都是缓存很多条数据或者是一个Dictionary甚至其他对象
tips:同一对象缓存可以使用同一沙盒路径 不同类型的数据千万别使用同一沙盒路径 不同类型数据如果使用同一路径那么缓存的很可能就是最后归档的数据 我尝试过 切记
1、缓存100条数据 数据内容为Person对象
创建Person类 遵守<NSCoding>协议
代码如下Person.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject<NSCoding>
@property (nonatomic,assign)int age;
@property (nonatomic,strong)NSString *name;
@end
NS_ASSUME_NONNULL_END
Person.m
#import "Person.h"
@implementation Person
/**
归档
*/
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInteger:_age forKey:@"age"];
[aCoder encodeObject:_name forKey:@"name"];
}
/**
解档
*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self == [super init]) {
_age = [aDecoder decodeIntForKey:@"age"];
_name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
@end
这里我在viewDidLoad中实现归档缓存,并对缓存数据进行解档
宏定义沙盒路径 #define PATH [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"BaseInfo"]
代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableData *archiverData = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:archiverData];
for (int i=0; i<100; i++) {
Person *model = [[Person alloc]init];
model.name = [NSString stringWithFormat:@"你好%d",i+1];
model.age = i+1;
//归档数据
[archiver encodeObject:model forKey:[NSString stringWithFormat:@"Person%d",i+1]];
}
//4.完成归档
[archiver finishEncoding];
//5.将归档写入
[archiverData writeToFile:PATH atomically:YES];
for (int i=0; i<100; i++) {
NSData *unarchiverData = [NSData dataWithContentsOfFile:PATH];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:unarchiverData];
Person *model = [unarchiver decodeObjectForKey:[NSString stringWithFormat:@"Person%d",i+1]];
NSLog(@"age = %d\rname = %@",model.age,model.name);
}
}
打印结果如下显示
2、缓存一条数据 APP中经常使用该数据 作为基础数据 最好进行缓存 防止调用网络请求频繁 导致用户体验不太好
切记多个Dictionary不能缓存到同一路径
这里我是网络请求后 对数据进行归档 代码如下
AFNModel *model = result;
//1.使用Data对象进行归档
NSMutableData *archiverData = [NSMutableData data];
//2.创建归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:archiverData];
//归档数据
[archiver encodeObject:model.data forKey:@"positionDict"];
//4.完成归档
[archiver finishEncoding];
[archiverData writeToFile:[NSString stringWithFormat:@"%@%@",PATH,@"positionDict"] atomically:YES];
对缓存的Dictionary进行解档 代码如下:
+ (NSDictionary *)getDataWithKey:(NSString *)key{
NSData *unarchiverData = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@%@",PATH,key]];
NSKeyedUnarchiver *unarchver = [[NSKeyedUnarchiver alloc]initForReadingWithData:unarchiverData];
return [unarchver decodeObjectForKey:key];
}