在完成某项需求时,我们需要对网络数据进行存储,比如进行广告展示,或者一些其他数据,对于第一次加载影响客户端的友好程度上,我们采用先请求存储后进行二次展示
步骤:
1.归档,首先将请求到的数据进行归档可以使用如下
NSData *model = [NSKeyedArchiver archivedDataWithRootObject:modelHttp];这里的modelHttp就是我们请求到并且解析出的网络数据
2.使用usedefault简单的本地存储
[USER_DEFAULTS setValue:model forKey:saveModel];
3.二次使用的时候进行从usedefault取出数据
NSData *data = [USER_DEFAULTS valueForKey:savedModel];
4.解归档
Model *modelHttp = [NSKeyedUnarchiver unarchiveObjectWithData:data];
然后就可以使用
注意:在进行归档时应该注意编码和解码,对于属性较少的情况下我们可以使用encoder和decoder即在模型类中
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (!self) {
return nil;
}
self.adIds = [decoder decodeObjectForKey:@"adIds"];
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.adIds forKey:@"adIds"];
}
但是当我们遇到的属性非常多的时候这样就不行了。使用runtime机制
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
unsigned int outCount;
Ivar * ivars = class_copyIvarList([self class], &outCount);
for (int i = 0; i < outCount; i ++) {
Ivar ivar = ivars[i];
NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];
[self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
}
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
unsigned int outCount;
Ivar * ivars = class_copyIvarList([self class], &outCount);
for (int i = 0; i < outCount; i ++) {
Ivar ivar = ivars[i];
NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];
[aCoder encodeObject:[self valueForKey:key] forKey:key];
}
}