您的位置:首页 > 移动开发 > IOS开发

ios 数据持久化之自定义模型的存储

2015-11-24 09:48 489 查看
开通微博第一天  谢谢支持

数据持久化之NSKeyedArchiver

 
 基本的数据类型如NSString、NSDictionary、NSArray、NSData、NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法就不管用了。archiver 方法可以做到。

  如果是自定义的模型,要实现数据持久化,自定义的模型要遵循NSCoding  协议。

NSCoding 是一个简单的协议,有两个方法: -initWithCoder: 和 encodeWithCoder:。遵循NSCoding协议的类可以被序列化和反序列化,这样可以归档到磁盘上或分发到网络上
废话不多说
直接上代码

.h文件

#import <Foundation/Foundation.h>

@interface HFAccount : NSObject <NSCoding>
/** string接口获取后的access token。*/
@property (nonatomic,copy) NSString *access_token;

/** 单位是秒数。*/
@property (nonatomic,copy) NSNumber *expires_in;

/** string当前用户的UID。*/
@property (nonatomic,copy) NSString *uid;

@end

.m文件

#import "HFAccount.h"

@implementation HFAccount

/**
 *  当一个对象要归档进沙盒中时,就会调用这个方法
 *  目的:在这个方法中说明这个对象的哪些属性要存进沙盒
 */
- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:self.access_tokenforKey:@"access_token"];
    [encoder encodeObject:self.expires_inforKey:@"expires_in"];
    [encoder encodeObject:self.uidforKey:@"uid"];
}

/**
 *  当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
 *  目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
 */
- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [superinit]) {
        self.access_token = [decoderdecodeObjectForKey:@"access_token"];
        self.expires_in = [decoderdecodeObjectForKey:@"expires_in"];
        self.uid = [decoderdecodeObjectForKey:@"uid"];
    }
    returnself;
}
@end

在你需要存储的地方
HFAccount *account = [[HFAccount alloc]init];

然后给你的模型赋值
  // 自定义对象的存储必须用NSKeyedArchiver,不再有什么writeToFile方法
    [NSKeyedArchiverarchiveRootObject:account
toFile:HWAccountPath];
解档

// 加载模型
    HFAccount *account = [NSKeyedUnarchiverunarchiveObjectWithFile:HWAccountPath];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息