在NSUserDefaults中将对象写入纯文本

时间:2015-08-20 01:25:54

标签: objective-c cocoa

如何将对象作为纯文本写入NSUserDefaults?

我为科学应用程序编写了一个单元转换系统,它基本上围绕“单元对象”的原理运行。这些对象表示在给定域中具有特定值的特定单元。域名由类名表示,因为所有内容都是有组织的,因此时间单位字面上称为“TimeUnit”,长度单位字面上称为“LengthUnit”。

“单位”的当前值由双精度表示,“单位”本身(即“米”,“开尔文”,“小时”,“磅”等)由NSString表示。

我需要能够将这些对象写入NSUserDefaults。

我已经使用NSCoding和NSKeyedArchiver实现了一个系统。这很好用,我可以存储和检索来自NSUserDefaults的单位,一切正常。

问题是NSKeyedArchiver的输出太大了。你从中获得的base64编码数据是这个巨大的字符块,这是不可能通过纯文本编辑器改变的,有些难以调试。我知道你可以通过在NSKeyedArchiver的setOutputFormat中使用NSPropertyListXMLFormat_v1_0来在某种程度上覆盖它,但即使这样也会产生一个相当冗长的输出,其中包含一大堆我并不真正关心的东西(我知道所有数据都是有原因的,但我猜这是因为NSKeyedArchiver旨在处理很多不同的情况。)

如果我可以使用自己的格式编码这些对象会容易得多。有点像:

class_name:double_value:unit_name

因此,温度单位的摄氏温度将达到22摄氏度:

TemperatureUnit:22:celsius

实现这样的目标的最佳方式是什么?我应该继承NSCoder吗?这会让我将对象存储为NSUserDefaults中的纯文本字符串而不是base64编码的二进制数据块吗?

1 个答案:

答案 0 :(得分:1)

对于这样的事情,您可以添加“序列化”和“反序列化”方法(或任何您想要的名称)。前者返回一个字符串,后者接受一个字符串并返回你的对象。

+ (MyUnitClass *)deserialize:(NSString *)encodedString {
    // split string, create new object, assign values
}

- (NSString *)serialize {
    return [NSString stringWithFormat:@"%@:%f:%@", self.classname, self.double_value, self.unit_name];
}

现在,您可以在其中一个对象上调用serialize并将字符串存储在NSUserDefaults中。使用deserialize从您在NSUserDefaults中存储的字符串中创建对象。