美文网首页
归档反归档的坑

归档反归档的坑

作者: hncjliyingjie | 来源:发表于2016-12-24 13:22 被阅读25次

今天的项目中由于后台返回的数据有点别致,8800多条数据存放在一个数组中.所以我在前端处理数据,并存到了一个数组和三个字典中.为了提高界面交互体验,决定使用归档反归档本地化这些数组和字典.

由于数组和字典中最终存放的是自定义的model,所以model必须遵循归档协议和拷贝协议----

在PhoneModel.h中

@interface PhoneModel : NSObject<NSCoding, NSCopying>

在PhoneModel.m中实现相应的协议方法

#pragma mark NSCoding

-(void)encodeWithCoder:(NSCoder *)aCoder{//编码

[aCoder encodeObject:_class_layer forKey:kclass_layerKey];

[aCoder encodeObject:_ID forKey:kIDKey];

[aCoder encodeObject:_parent_id forKey:kparent_idKey];

[aCoder encodeObject:_sort_id forKey:ksort_idKey];

[aCoder encodeObject:_title forKey:ktitleKey];

}

-(id)initWithCoder:(NSCoder *)aDecoder{//解码

if(self == [super init]){

_class_layer = [aDecoder decodeObjectForKey:kclass_layerKey];

_ID = [aDecoder decodeObjectForKey:kIDKey];

_parent_id = [aDecoder decodeObjectForKey:kparent_idKey];

_sort_id = [aDecoder decodeObjectForKey:ksort_idKey];

_title = [aDecoder decodeObjectForKey:ktitleKey];

  }

return self;

}

#pragma mark -

#pragma mark NSCopying

-(id)copyWithZone:(NSZone *)zone{

PhoneModel *model = [[[self class]allocWithZone:zone]init];

model.class_layer = [self.class_layer copyWithZone:zone];

model.ID = [self.ID copyWithZone:zone];

model.parent_id = [self.parent_id copyWithZone:zone];

model.sort_id = [self.sort_id copyWithZone:zone];

model.title = [self.title copyWithZone:zone];

return model;

}

在viewController.m中

#define kPinPaiFileName @"pinpaiPath"

#define kXingHaoFileName @"xinghaoPath.data"

#define kPinPaiDataKey @"pinpaiData"

#define kXingHaoDataKey @"xinghaoData"

//1.本地品牌数据的路径

-(NSString *)pinpaiFilePath{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

return [documentsDirectory stringByAppendingPathComponent:kPinPaiFileName];

}

//2.本地型号数据的路径

-(NSString *)xinghaoFilePath{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

return [documentsDirectory stringByAppendingPathComponent:kXingHaoFileName];

}

数组和字典归档--

//1.保存品牌数据源

NSMutableData *pinpaiData = [[NSMutableData alloc] init];

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:pinpaiData];

[archiver encodeObject:self.pinpaiArray forKey:kPinPaiDataKey];

[archiver finishEncoding];

[pinpaiData writeToFile:[self pinpaiFilePath] atomically:YES];

//2.保存型号数据源

NSMutableData *xinghaoData = [[NSMutableData alloc] init];

NSKeyedArchiver *xinghaoArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:xinghaoData];

[xinghaoArchiver encodeObject:self.xinghaoDic forKey:kXingHaoDataKey];

[xinghaoArchiver finishEncoding];

[xinghaoData writeToFile:[self xinghaoFilePath] atomically:YES];

数组和字典反归档--

//1.取品牌数据

NSLog(@"路径:%@", [self pinpaiFilePath]);

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self pinpaiFilePath]];

NSKeyedUnarchiver *unarchiver = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];//此处一定要用alloc,不能用横线划掉的方法,否则取出来的数据个数为零.

NSMutableArray *array = [unarchiver decodeObjectForKey:kPinPaiDataKey];

[unarchiver finishDecoding];

//2.取型号数据

NSData *xinghaoData = [[NSMutableData alloc] initWithContentsOfFile:[self xinghaoFilePath]];

NSKeyedUnarchiver *xinghaoUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:xinghaoData];

NSMutableDictionary *xinghaoDic = [xinghaoUnarchiver decodeObjectForKey:kXingHaoDataKey];

[xinghaoUnarchiver finishDecoding];

相关文章

网友评论

      本文标题:归档反归档的坑

      本文链接:https://www.haomeiwen.com/subject/zhilvttx.html