[英]What is the best way to save an NSMutableArray to NSUserDefaults?
我有一个名为Occasion的自定义对象,定义如下:
#import <Foundation/Foundation.h>
@interface Occasion : NSObject {
NSString *_title;
NSDate *_date;
NSString *_imagePath;
}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSString *imagePath;
现在我有一个NSMutableArray of Occasions,我想保存到NSUserDefaults。 我知道这是不可能的,所以我想知道哪种方法最简单? 如果序列化是答案,那么如何? 因为我阅读了文档但却无法理解它的完整工作方式。
您应该使用NSKeyedArchiver
的序列将数组序列化为NSData
,将其保存到NSUserDefaults
,然后使用NSKeyedUnarchiver
将其反序列化:
NSData *serialized = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[[NSUserDefaults standardUserDefaults] setObject:serialized forKey:@"myKey"];
//...
NSData *serialized = [[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:serialized];
您需要在Occasion
类中实现NSCoding
协议,并正确保存各种属性以使其正常工作。 有关更多信息,请参阅“ 存档和序列化编程指南” 。 执行此操作不应超过几行代码。 就像是:
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
[coder encodeObject:_title forKey:@"_title"];
[coder encodeObject:_date forKey:@"_date"];
[coder encodeObject:_imagePath forKey:@"_imagePath"];
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
_title = [[coder decodeObjectForKey:@"_title"] retain];
_date = [[coder decodeObjectForKey:@"_date"] retain];
_imagePath = [[coder decodeObjectForKey:@"_imagePath"] retain];
return self;
}
NSUserDefaults
用于用户首选项,而不是存储应用程序数据。 使用CoreData或将对象序列化到文档目录中。 你需要让你的类实现NSCoding
协议才能工作。
1)在Occasion.h
实现NSCoding
@interface Occasion : NSObject <NSCoding>
2)在Occasion.m
实现协议
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.title = [aDecoder decodeObjectForKey:@"title"];
self.date = [aDecoder decodeObjectForKey:@"date"];
self.imagePath = [aDecoder decodeObjectForKey:@"imagePath"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:title forKey:@"title"];
[aCoder encodeObject:date forKey:@"date"];
[aCoder encodeObject:imagePath forKey:@"imagePath"];
}
3)将数据存档到文档目录中的文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *path= [documentsPath stringByAppendingPathComponent:@“occasions”];
[NSKeyedArchiver archiveRootObject:occasions toFile:path];
4)取消归档......
NSMutableArray *occasions = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
您可以在Occasion
实施NSCoding
。
然后使用[NSKeyedArchiver archivedDataWithRootObject:myArray]
从数组创建NSData
对象。 您可以将其置于用户默认值中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.