iOS学习 --- iOS12对象序列化(NSKeyedArchiver/NSKeyedUnarchiver)

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<Class> *)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];
	//获取array
	NSArray *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

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
@interface ServiceModel : NSObject<NSSecureCoding>//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;

@end

NS_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和归档​​​​​​​

猜你喜欢

转载自blog.csdn.net/jiaxin_1105/article/details/125601997