利用NSKeyedUnarchiver把数据存储到本地

在开发中,如果使用plist存贮到本地的话,存贮的类型有限,这时候,我们可以就可以考虑利用NSKeyedUnarchiver把数据存储到本地,通过这个方法我们可以将model存贮到本地,一般用来保存用户的账号信息之类的

第一步,我们建一个model,

#import <Foundation/Foundation.h>

@interface Account : NSObject

@property (nonatomic, copy) NSString *phone; //手机号

@property (nonatomic, copy) NSString *uid; //用户id

@property (nonatomic, copy) NSString *nickname;

@property (nonatomic, copy) NSString *password;

@property (nonatomic, copy) NSString *tel; //座机

@property (nonatomic, copy) NSString *last_login;

//@property (nonatomic, copy) NSString *new_phone;

@property (nonatomic, copy) NSString *uthumb; //头像地址

@property (nonatomic, copy) NSString *province;

@property (nonatomic, copy) NSString *city;

@property (nonatomic, copy) NSString *area;

@property (nonatomic, copy) NSData *photoData;

@end

#import "Account.h"

@implementation Account

  • (NSDictionary *)replacedKeyFromPropertyName

{

return @{@"uid": @"id"};

}

@end

//定义一个 .h 头文件,用来简写我们的单例

// .h

#define single_interface(class) + (class *)shared##class;

// \ 代表下一行也属于宏

// ## 是分隔符

#define single_implementation(class) \

static class *_instance; \

\

  • (class *)shared##class \

{ \

if (_instance == nil) { \

_instance = \[self alloc init]; \

} \

return _instance; \

} \

\

  • (id)allocWithZone:(NSZone *)zone \

{ \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{ \

_instance = super allocWithZone:zone; \

}); \

return _instance; \

}
第二步:封装一个方法,使用NSKeyedUnarchiver保存到本地
// AccountTool.h

//

#import <Foundation/Foundation.h>

#import "Account.h"

#import "SingleTon.h"

@interface AccountTool : NSObject

single_interface(AccountTool)

  • (void)saveAccount:(Account *)account;

  • (void)removeAccount;

// 获得当前账号

@property (nonatomic, readonly) Account *account;

@end

//

// AccountTool.m

//

#import "AccountTool.h"

// 文件路径---->>获取分类的沙盒文件路径

#define kFile NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)\[0 stringByAppendingPathComponent:@"account.data"]

@implementation AccountTool

single_implementation(AccountTool)

  • (instancetype)init

{

if (self = super init) {

//解归档该路径下的文件

_account = NSKeyedUnarchiver unarchiveObjectWithFile:kFile;

}

return self;

}

  • (void)saveAccount:(Account *)account

{

_account = account;

//将数据归档,如果前面的文件不存在,就会在归档数据时创建

NSKeyedArchiver archiveRootObject:account toFile:kFile;

}

  • (void)removeAccount

{

if (\[NSFileManager defaultManager fileExistsAtPath:kFile]) {

\[NSFileManager defaultManagerremoveItemAtPath:kFile error:nil];

}

}

@end

//这样我们就可以使用这个工具类了(下面以保存登录后的账号为例说明如何使用)

判断是否有数据

if (AccountTool sharedAccountTool.account.uid == nil || ! kUserLogin || \[AccountTool sharedAccountTool.account.uid isKindOfClass:NSNull class]){

//无数据

}else {

//有数据

}

//登录成功后将数据用mj工具类将字典直接保存到model中,然后直接保存到本地

Account *currentAccount = Account mj_objectWithKeyValues:userInfo;

\[AccountTool sharedAccountTool saveAccount:currentAccount];
//

相关推荐
zhongben123_6 小时前
从零开发一个打车APP:技术选型、系统架构与成本评估指南
大数据·运维·ios·系统架构·uni-app·web app
茶底世界之下6 小时前
人像清晰度加多少?用 Awaking 对照皮肤与发丝
ios
Anhty9 小时前
2026三款AI变声器测评:iOS男变女自然声线实测
人工智能·功能测试·ios·智能手机
传奇开心果编程9 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
腾讯端服务10 小时前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙
2501_9159184110 小时前
Windows 上开发 React Native iOS,真机调试、Fast Refresh 与打包 ipa
windows·vscode·react native·ios·个人开发·swift·敏捷流程
Joy T20 小时前
voice-dump-to-todo:把混乱的语音整理成可执行待办,一个实用的 Agent Skill
ide·macos·语音识别·xcode·任务管理·自研skill
aiopencode1 天前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
奇牙coding1 天前
GPT-5.5 报 401 invalid_api_key 怎么办?换密钥前按 4 层排查请求头、项目权限和端点
数据库·gpt·ios·ai
szp20051 天前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift