利用NSKeyedUnarchiver把数据存储到本地

本文介绍了在iOS应用开发中,如何使用NSKeyedUnarchiver将模型(如Account对象)保存到本地,以便存储用户账号信息,包括创建Account模型、单例工具类的封装以及数据的存取操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

//

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值