使用NSKeyedUnarchiver归档数据到本地,很多时候保存的并不是基础数据类型,更多是自己定义的Model。有时会碰到归档或者读取的内容跟自己保存的数据类型不匹配。
现在按照思路一步一步解决:
1.先保存文件
保存的数据的类型
#importNS_ASSUME_NONNULL_BEGIN @interface HSFileModel : NSObject @property (nonatomic, strong) NSURL *fileUrl; //文件链接 @property (nonatomic, copy) NSString *fileName; //文件名 @end
@property (nonatomic, strong) NSMutableDictionary*selectedFilesData;
保存的数据到本地的方法
// 保存selectedFilesData到本地文件 - (void)saveSelectedFilesDataToLocal { // 获取文件路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; // 拼接文件路径 NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"SelectedFilesData.plist"]; // 归档字典对象 NSError *error = nil; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.selectedFilesData requiringSecureCoding:YES error:&error]; if (error) { NSLog(@"Error archiving data: %@", error); } else { // 将归档数据写入文件 [data writeToFile:filePath atomically:YES]; } }
2.读取刚才保存的数据,确保读取的数据的文件路径跟保存的文件路径一致。
- (void)loadSelectedFilesDataFromLocal { // 获取文件路径 // 获取文件路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; // 拼接文件路径 NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"SelectedFilesData.plist"]; // 尝试从文件中读取归档数据 NSData *data = [NSData dataWithContentsOfFile:filePath]; if (data) { // 解档数据为字典对象 NSError *error = nil; self.selectedFilesData = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[NSMutableDictionary.class, NSString.class, HSFileModel.class, NSURL.class]] fromData:data error:&error]; if (error) { NSLog(@"Error unarchiving data: %@", error); // 可以在此处理解档错误的情况 } } else { // 如果文件不存在或读取失败,可以初始化一个空字典 self.selectedFilesData = [NSMutableDictionary dictionary]; } }
当调用读取的方法的时候会有一个错误如下:
Printing description of error:
Error Domain=NSCocoaErrorDomain Code=4864 "This decoder will only decode classes that adopt NSSecureCoding. Class 'HSFileModel' does not adopt it." UserInfo={NSDebugDescription=This decoder will only decode classes that adopt NSSecureCoding. Class 'HSFileModel' does not adopt it.}
这因为保存的数据类型有自己定义的Model,而且HSFileModel没有实现NSSecureCoding协议导致不能解码。所有被编码和解码的类都必须遵循NSSecureCoding协议。
3.给HSFileModel实现NSSecureCoding协议
#importNS_ASSUME_NONNULL_BEGIN @interface HSFileModel : NSObject @property (nonatomic, strong) NSURL *fileUrl; //文件链接 @property (nonatomic, copy) NSString *fileName; //文件名 @end
#import "HSFileModel.h" @implementation HSFileModel + (BOOL)supportsSecureCoding { return YES; } - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.fileUrl forKey:@"fileUrl"]; [coder encodeObject:self.fileName forKey:@"fileName"]; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { self.fileUrl = [coder decodeObjectForKey:@"fileUrl"]; self.fileName = [coder decodeObjectForKey:@"fileName"]; } return self; } @end
4.对于 + (nullable id)unarchivedObjectOfClasses:(NSSet
使用这个方法解档的话,参数(NSSet
self.selectedFilesData = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[NSMutableDictionary.class, NSString.class, HSFileModel.class, NSURL.class]] fromData:data error:&error];
到此结束,如大佬有补充请指出。
猜你喜欢
- 15天前(夏日旅行海报)夏日旅行|精简行囊 向快乐进发
- 15天前(艾美酒店连锁)艾美酒店全球夏日计划回归,联手Wishbone主厨推出创新冰饮
- 15天前(七尚酒店百度百科)Lohkah七尚酒店首度开创充满新知的闽地研学旅程
- 15天前(罗马尼亚的匈牙利族自治)江苏赴匈牙利、罗马尼亚开展文旅交流推广活动
- 15天前(“为人民绽放——国家艺术基金优秀剧目展演”在合肥开幕)“为人民绽放——国家艺术基金优秀剧目展演”在合肥开幕
- 15天前(重庆恐龙化石遗址)重庆黔江恐龙化石抢救性发掘新闻发布会举行
- 15天前(云南滇陇工程咨询有限公司)陇滇携手谋发展 文旅合作谱新篇
- 15天前(岭南东方大酒店)粤西成势 | 阳江阳春长兴岭南东方酒店正式签约,粤西文旅再添明珠
- 15天前(2025年安徽省“百场黄梅唱响百家景区”示范展示启动)2025年安徽省“百场黄梅唱响百家景区”示范展示启动
- 15天前(我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章