NSKeyedArchiver 归档
所谓的归档,就是将数据写到一个文件里面去。一般我们的应用的变量常量之类的数据都是在内存里面的,只要APP关闭,这些数据都会丢失。但是把数据存储到文件里面去,就能将数据保存到本地磁盘里面(目前iOS基本就是在沙盒里面操作了),不管是APP关闭还是重启设备,下次启动APP的时候都能够读出来。
NSKeyedUnarchiver解档
- 所谓解档(别人也叫反归档),就是将数据从文件里面读取出来。在程序里面使用。
iOS12之前
归档
+ (NSData *)archivedDataWithRootObject:(id)rootObject API_DEPRECATED("Use +archivedDataWithRootObject:requiringSecureCoding:error: instead", macosx(10.2,10.14), ios(2.0,12.0), watchos(2.0,5.0), tvos(9.0,12.0));NSMutableArray *array = [NSMutableArray array];for (ServiceModel *model in self.selectedArray) {NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];[array addObject:data];}[kUserDefaults setObject:array forKey:keySelectedArray];[kUserDefaults synchronize];解档
+ (nullable id)unarchiveObjectWithData:(NSData *)data API_DEPRECATED("Use +unarchivedObjectOfClass:fromData:error: instead", macosx(10.2,10.14), ios(2.0,12.0), watchos(2.0,5.0), tvos(9.0,12.0));NSMutableArray *localArray = [NSMutableArray array]; //获取array NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:keySelectedArray];for (NSData *data in array) {//解码ServiceModel*model = [NSKeyedUnarchiver unarchiveObjectWithData:data];[localArray addObject:model]; }
iOS12之后
归档
+ (nullable NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));NSMutableArray *array = [NSMutableArray array];for (TCMeServiceModel *model in selectedArray) {NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:YES error:nil];[array addObject:data];}[kUserDefaults setObject:array forKey:keySelectedArray];[kUserDefaults synchronize];解档
+ (nullable id)unarchivedObjectOfClasses:(NSSet*)classes fromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)); NSMutableArray *localArray = [NSMutableArray array];//获取arrayNSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:keySelectedArray];for (NSData *data in array) {//解码NSSet *classSet = [NSSet setWithObjects:[ServiceModel class],[NSString class], nil];ServiceModel*model = [NSKeyedUnarchiver unarchivedObjectOfClasses:classSet fromData:data error:nil];if (model) {[localArray addObject:model];}}
model
#importNS_ASSUME_NONNULL_BEGIN @interface ServiceModel : NSObject //NSCopying,NSSecureCoding /** image */ @property (nonatomic, copy) NSString *image; /** title */ @property (nonatomic, copy) NSString *title; /** vc */ @property (nonatomic, copy) NSString *vc;-(instancetype)initWithDict:(NSDictionary *)dict; +(instancetype)resultListWithDict:(NSDictionary *)dict;@endNS_ASSUME_NONNULL_END #import "ServiceModel.h"@implementation ServiceModel-(instancetype)initWithDict:(NSDictionary *)dict{self = [super init];if (self) {[self setValuesForKeysWithDictionary:dict];}return self; }+(instancetype)resultListWithDict:(NSDictionary *)dict{ return [[self alloc]initWithDict:dict]; }+ (BOOL)supportsSecureCoding {return YES; }//归档 - (void)encodeWithCoder:(nonnull NSCoder *)aCoder {[aCoder encodeObject:_image forKey:@"image"];[aCoder encodeObject:_title forKey:@"title"];[aCoder encodeObject:_vc forKey:@"vc"]; }//解档 - (nullable instancetype)initWithCoder:(nonnull NSCoder *)aDecoder {self = [super init];if (self) {_image = [aDecoder decodeObjectForKey:@"image"];_title = [aDecoder decodeObjectForKey:@"title"];_vc = [aDecoder decodeObjectForKey:@"vc"];}return self; }@end
归档存储的是数组,数组中嵌套的是model对象:
另:归档存储的是数组嵌套模型的时候:
①、model对象中要遵循NSSecureCoding协议;
②、model对象.m类中,要实现+ (BOOL)supportsSecureCoding方法,并返回真。
相关文章
iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法
iOS 12对象序列化(NSKeyedArchiver)
iOS应用存储数据的常用的方式之plist和归档