关于用户账号的归档和反归档的问题,现以代码示例如下:
1.首先创建一个用户账号的Model(以下创建为HWAccont)
HWAccount.H
@interface HWAccount : NSObject <NSCoding>
/** string 用于调用access_token,接口获取授权后的access token。*/
@property (nonatomic, copy) NSString *access_token;
/** string access_token的生命周期,单位是秒数。*/
@property (nonatomic, copy) NSNumber *expires_in;
/** string 当前授权用户的UID。*/
@property (nonatomic, copy) NSString *uid;
+ (instancetype)accountWithDict:(NSDictionary *)dict;
记得遵守NSCoding协议!!
HWAccount.m
+ (instancetype)accountWithDict:(NSDictionary *)dict
{
HWAccount *account = [[self alloc] init];
account.access_token = dict[@"access_token"];
account.uid = dict[@"uid"];
account.expires_in = dict[@"expires_in"];
return account;
}
/**
* 当一个对象要归档进沙盒中时,就会调用这个方法
* 目的:在这个方法中说明这个对象的哪些属性要存进沙盒
*/
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.access_token forKey:@"access_token"];
[encoder encodeObject:self.expires_in forKey:@"expires_in"];
[encoder encodeObject:self.uid forKey:@"uid"];
}
/**
* 当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
* 目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
*/
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
self.access_token = [decoder decodeObjectForKey:@"access_token"];
self.expires_in = [decoder decodeObjectForKey:@"expires_in"];
self.uid = [decoder decodeObjectForKey:@"uid"];
}
return self;
}
2.在appdelegate 的didFinishLaunchingWithOptions方法里
// // 沙盒路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [doc stringByAppendingPathComponent:@"account.archive"];
HWAccount *account = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
// 将返回的账号字典数据 --> 模型,存进沙盒
HWAccount *account = [HWAccount accountWithDict:responseObject];
// 自定义对象的存储必须用NSKeyedArchiver,不再有什么writeToFile方法
[NSKeyedArchiver archiveRootObject:account toFile:path];
其实,关于归档和反归档的方法,MJExtension做了很好的处理,可以使用。 我们也可以将存储账号信息封装成一个工具类,看自己喜好。