IOS 归档
数据持久化 有些时候 需要把数据存到本地(沙河) 方便取出来使用 一般ios 里用的较多的是数据库 和plist文件
但是由于格式限制 你不能直接把模型存进去 因为他们不支持模型这个类型 所以我们会用到归档。
我们利用 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];把传入的模型model归档成二进制 写入plist或者数据库 在利用解归档将数据解析出来 但是在用归档之前 我们要了解一点 ios是按照键值对存储数据 即 KEY —value 一个间对应一个值 如果是我们的自定义对象 是没有键的 所以我们要重写1)encodeWithCoder: 2)initWithCoder: 3)copyWithZone:这三个方法 但是为了偷懒 我用了 MJExtension
有现成的不用 非要花一天左右重写方法 那不是我的风格 所以我很喜欢动漫冰果里面的名言 @"能不做的事就不做。非要做不可的话就从简。"
我的 cell 数据模型
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ContentModel : NSObject
@property (nonatomic ,strong) UIImage *cellImage;
@property (nonatomic ,copy)NSString *cellText;
@end
#import "ContentModel.h"
#import "MJExtension.h"
@implementation ContentModel
MJCodingImplementation//归档的关键 此处可以省略你几百行代码
@end
因为我的数据层次太多 每一层不得不用到归档问题 所以下面我只贴出一点点代码 关于模型归档用到的地方 在获取到数据源的地方 解析到模型数据的时候 归档成NSData self.contentModelArray 解析获得的数据是数组类型
NSMutableArray *modelarray =[[NSMutableArray alloc]init];
for(int i =0; i<self.contentModelArray.count; i++){
ContentModel *model = self.contentModelArray[i];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
[modelarray addObject:data];
}
这里是存储路径 存到沙河 document路径的diandian文件夹里plist文件
NSArray * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentPath = [path objectAtIndex:0];
NSFileManager *fiemanager =[NSFileManager defaultManager];
NSString *myfile =[documentPath stringByAppendingPathComponent:@"diandian"];//点点文件夹
BOOL res =[fiemanager createDirectoryAtPath:myfile withIntermediateDirectories:YES attributes:nil error:nil];
if(res){//文件夹存在 将数组写到 text.plist文件中
NSString *filepath =[myfile stringByAppendingPathComponent:@"text.plist"];
[modelarray writeToFile:filepath atomically:YES];//写到plist
}
要用时 通过沙河找到plist 取出数组里面的元素 利用解归档将模型还原出来 取相应的值给cell就行 ContentModel *model = [NSKeyedUnarchiver unarchiveObjectWithData:数组元素(modelarray[i])];
字典 字符串 数组可以直接写到plist 但是自定义的对象需要我们重写方法 所以建议三方MJ 功能强大