在开发中,如果使用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; \
}
// 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];