iPhoneSDK开发136技系列:第23技使用NSCoding保存数据
本系列文章基于日本最近热卖的《PhoneSDK开发136技》一书的目录和实例代码。由于无法获得此书,因此只能猜测加个人发挥。确切地说应该是一个读码笔记系列。
为了将应用数据存储到硬盘中,iOS提供基本的文件API、Property List序列化、SQLite、CoreData以及NSCoding。对于轻量级的数据要求,NSCoding因其简单而成为一种比较合适的方式。
NSCoding是一个你需要在数据类上要实现的协议以支持数据类和数据流间的编码和解码。数据流可以持久化到硬盘。而实现NSCoding其实很简单,因此有时会很有用。相关代码如下:
- // 键值宏定义
- #define SAMPLEDATA_KEY_STARS (@"stars")
- #define SAMPLEDATA_KEY_TITLE (@"title")
- #define SAMPLEDATA_KEY_ITEMS (@"items")
- @interface SampleData : NSObject <NSCoding>{
- int starCount;
- NSString *titleText;
- NSMutableDictionary *items;
- int tempNumber; //不保存的变量
- }
- @property(nonatomic,readwrite) int starCount;
- @property (nonatomic, retain, readwrite) NSString *titleText;
- @property (nonatomic, retain, readwrite) NSMutableDictionary *items;
- @property(nonatomic,readwrite) int tempNumber;
- @end
- @implementation SampleData
- @synthesize starCount, titleText, items, tempNumber;
- - (void)encodeWithCoder:(NSCoder*)coder
- {
- [coder encodeObject:titleText forKey:SAMPLEDATA_KEY_TITLE];
- [coder encodeObject:items forKey:SAMPLEDATA_KEY_ITEMS];
- [coder encodeInt:starCount forKey:SAMPLEDATA_KEY_STARS];
- }
- - (id)initWithCoder:(NSCoder*)decoder
- {
- if ((self = [super init])){
- //被init:调用时使用默认值
- self.titleText = nil;
- self.items = [[NSMutableDictionary alloc]init];
- starCount = 0;
- tempNumber = 0;
- if (decoder==nil) {
- return self;
- }
- // 取值前确认相应的键值是否存在。
- if ([decoder containsValueForKey:SAMPLEDATA_KEY_TITLE]) {
- self.titleText =
- [decoder decodeObjectForKey:SAMPLEDATA_KEY_TITLE];
- }
- if ([decoder containsValueForKey:SAMPLEDATA_KEY_ITEMS]) {
- self.items =
- [decoder decodeObjectForKey:SAMPLEDATA_KEY_ITEMS];
- }
- if ([decoder containsValueForKey:SAMPLEDATA_KEY_STARS]) {
- starCount = [decoder decodeIntForKey:SAMPLEDATA_KEY_STARS];
- }
- }
- return self;
- }
- - (id)init {
- if ((self = [super init])){
- [self initWithCoder:nil];
- }
- return self;
- }
- @end
就这些! 其中我们需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码,initWithCoder就是解码。encodeWithCoder方法传入的是一个NSCoder对象,实现的时候我们就可以调用encodeObject、encodeFloat、encodeInt等各种方法并通过指定键值进行编码。