实际上就是写一个model类 然后将要存数据放到model中,然后将model添加到数组,然后对数组及数组中放的model归档,本地存储起来,解档,拿到数据在需要的地方显示出来
因为model是一个自己写的类 方便起见 归档解档encodeWithCoder和initWithCoder:方法中用了runtime获取属性
下面是核心代码(由于刚开始只是存当前登录用户的数据所以存的是一个数组,后来想到切换用户,然后将数组按登录用户的userid存到字典中然后再存储的,所以代码中有些字典标识符写得不够准确名称中含有array)
model 的相关代码
//
// LMDraftModel.h
// TestArchiver
//
// Created by 闵哲 on 2017/6/13.
// Copyright ? 2017年 Gunmm. All rights reserved.
//#import <Foundation/Foundation.h>@interface GunmmDraftModel : NSObject/* 数据 */
@property (nonatomic, strong) NSDictionary *dataDic;
/* 时间 */
@property(nonatomic,copy)NSString *time;
/* 类型 */
@property(nonatomic,copy)NSString *entityName;@end
//
// LMDraftModel.m
// TestArchiver
//
// Created by 闵哲 on 2017/6/13.
// Copyright ? 2017年 Gunmm. All rights reserved.
//#import "GunmmDraftModel.h"
#import <objc/runtime.h>
@interface GunmmDraftModel()<NSCoding>
@end
@implementation GunmmDraftModel-(void)encodeWithCoder:(NSCoder *)aCoder
{unsigned int outCount = 0;Ivar *ivars = class_copyIvarList([self class], &outCount);for (unsigned int i = 0; i<outCount; i++) {Ivar ivar = ivars[i];NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];id value = [self valueForKey:key];[aCoder encodeObject:value forKey:key];}free(ivars);
}-(instancetype)initWithCoder:(NSCoder *)aDecoder
{self = [super init];if (self) {unsigned int OutCount = 0;Ivar *ivars = class_copyIvarList([self class], &OutCount);for (unsigned int i=0; i<OutCount; i++) {Ivar ivar = ivars[i];NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];[self setValue:[aDecoder decodeObjectForKey:key] forKey:key];}free(ivars);}return self;
}
@end
存储的管理类的相关代码
//
// KeyArchiverManager.h
// TestArchiver
//
// Created by 闵哲 on 2017/6/13.
// Copyright ? 2017年 Gunmm. All rights reserved.
//#import <Foundation/Foundation.h>@interface KeyArchiverManager : NSObject/*** 单例** @return 返回单例对象*/
+ (instancetype)sharedClient;/*** 对数据进行归档** @param dataArray 需要进行归档的数据*/
-(void)setArchiverDataWithData:(NSMutableDictionary *)dataDic;/*** 获取解归档的数据** @return 解归档后的数组*/
- (NSMutableDictionary *)getArchiverData;/*** 获取文件路径** @return 返回文件路径*/
-(NSString *)getAllFilePath;@end
//
// KeyArchiverManager.m
// TestArchiver
//
// Created by 闵哲 on 2017/6/13.
// Copyright ? 2017年 Gunmm. All rights reserved.
//#import "KeyArchiverManager.h"/*** 文件后缀名*/
NSString *const kFileDefaultPathExtension = @"cache";
/*** 默认文件名*/
NSString *kFileDefaultFileName = @"draftFile";@implementation KeyArchiverManager/*** 单例** @return 返回单例对象*/
+ (instancetype)sharedClient
{static KeyArchiverManager *client = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{client = [[KeyArchiverManager alloc]init];});return client;
}/*** 对数据进行归档** @param dataArray 需要进行归档的数据*/
-(void)setArchiverDataWithData:(NSMutableDictionary *)dataDic
{NSString *fileAllPath = [self getAllFilePath];if([[NSFileManager defaultManager] fileExistsAtPath:fileAllPath]) {//先将该地址存在的文件删除,再存储。NSError *error = nil;if(![[NSFileManager defaultManager] removeItemAtPath:fileAllPath error:&error]) {NSLog(@"Cannot remove file: %@", error);}}[NSKeyedArchiver archiveRootObject:dataDic toFile:fileAllPath];
}/*** 获取解归档的数据** @return 解归档后的数组*/
- (NSMutableDictionary *)getArchiverData
{NSString *fileAllPath = [self getAllFilePath];NSMutableDictionary *newDataArray = [NSKeyedUnarchiver unarchiveObjectWithFile:fileAllPath];return newDataArray;
}/*** 获取文件路径** @return 返回文件路径*/
-(NSString *)getAllFilePath
{NSString *paths = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];NSString *fileAllPath = [[paths stringByAppendingPathComponent:kFileDefaultFileName] stringByAppendingPathExtension:kFileDefaultPathExtension];return fileAllPath;
}
@end简单使用
存
-(void)saveDraftBox
{//modelGunmmDraftModel *model = [[GunmmDraftModel alloc]init];model.dataDic = _draftDictionary;model.entityName = @"event";NSDateFormatter* formater = [[NSDateFormatter alloc] init];[formater setDateFormat:@"yyyy-MM-dd HH:mm:SS"];NSString *time = [formater stringFromDate:[[NSDate alloc]init]];model.time = time;NSMutableDictionary *draftDictionary = [[KeyArchiverManager sharedClient]getArchiverData];if (!draftDictionary) {draftDictionary = [NSMutableDictionary dictionary];}NSMutableArray *draftArrays = [[draftDictionary objectForKey:[WiseApplicationViewController getUserId]]mutableCopy];if (!draftArrays) {draftArrays = [NSMutableArray array];}if ([_pageType isEqualToString:@"draftPage"]) {[draftArrays replaceObjectAtIndex:_indexOfKeyArchiver withObject:model];}else if ([_pageType isEqualToString:@"newPage"]){[draftArrays insertObject:model atIndex:0];}[draftDictionary setObject:draftArrays forKey:[WiseApplicationViewController getUserId]];[[KeyArchiverManager sharedClient]setArchiverDataWithData:draftDictionary];}
查
NSDictionary *dataDic = [[KeyArchiverManager sharedClient]getArchiverData];dataList = [dataDic objectForKey:[WiseApplicationViewController getUserId]];