平台:XCode5 语言:目标C. 项目:iOS应用程序
我基本上来自Java和C#背景,这是我的第一个iOS应用程序,我感觉非常有限。
我正在开发一个需要存储用户数据的应用程序。 大约有10个数据模型类,其中一些类具有自定义类型的属性。 在应用使用期限内,所有型号的记录总数将少于1000。 基本上,在任何单个日期,只能生成每个日期模型的1个对象。 除了像“为日期d显示数据模型类型X的一条记录”这样的基本查询之外,对保存的数据的查询不会太多。
我正在考虑使用一种简单的方法,我在一个简单的文本文件或使用序列化的东西中序列化每个数据模型的记录。因此,无论何时创建新记录,都会将其序列化并写入包含先前此类记录的文件。
我知道我必须将文件中的所有现有记录反序列化为NSMutableArray,添加新记录,然后将新的NSMutableArray序列化。 我更喜欢使用Generics或NSMutableObject创建一个具有静态函数的类。
现在,问题是: 1.考虑到上面解释的场景,这里序列化/反序列化的最佳方法是什么。我已经阅读了有关属性列表和NScoding协议的内容。我倾向于使用NSCoding协议。这是正确的做法吗?
我读到我需要实现initWithCoder函数,其中所有需要序列化的属性都将被称为键/值对。如果某些属性属于自定义类型,我将在此处做什么?例如,名为“room”的类型为“distance”类型的长度属性,其中“distance”是一个类,其中包含两个类型为integer的属性 - 英尺和英寸。是的,这个距离空间的东西只是一个例子来理解我的问题的解决方案。
有关自定义类型的序列化/反序列化对象的详细信息,再次提供自定义类型的某些属性,将不胜感激。
答案 0 :(得分:2)
在iOS中将某些内容序列化为NSData的最简单方法是使用NSKeyedArchiver / NSKeyedUnarchiver。 对于自定义对象,您需要实现NSCoding协议。
请注意,存储在数组中的对象也必须支持NSCoding。
但是,在反序列化时,代替NSMutableArray对象,您将收到不可变的NSArray对象。要获得可变实例,您必须进行
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
myMutableArray = [NSMutableArray arrayWithArray:[aDecoder decodeObjectForKey:@"myMutableArray"]];
}
return self;
}