利用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 defaultManager\]removeItemAtPath: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\]; //

相关推荐
YungFan12 小时前
iOS26适配指南之UINavigationController
ios·swift
木叶丸14 小时前
Flutter 生命周期完全指南
android·flutter·ios
Keya17 小时前
解决 pod install 警告信息显示不完全的方法
ios·xcode·cocoapods
随笔记19 小时前
uniapp开发的小程序输入框在ios自动填充密码,如何欺骗苹果手机不让自动填充
前端·ios·app
unicrom_深圳市由你创科技21 小时前
Unity开发如何解决iOS闪退问题
unity·ios·蓝桥杯
TE-茶叶蛋21 小时前
iOS打包流程
ios
Daniel_Coder1 天前
iOS Widget 开发-1:什么是 iOS Widget?开发前的基本认知
ios·swiftui·swift·widget
AirDroid_cn2 天前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
杂雾无尘2 天前
开发者必看,全面解析应用更新策略,让用户无法拒绝你的应用更新!
ios·xcode·swift