如何使用NSKeyedArchiever归档两个对象?

时间:2011-06-29 03:41:57

标签: iphone nskeyedarchiver

以前,我有一个数组,其中我使用NSKeyedArchiver来实现。

[NSKeyedArchiver archiveRootObject:array toFile:docPath];

致电applicationWillTerminateapplicationDidEnterBackground

启动时,在didFinishLaunchingWithOPtions中,数组未被删除:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

一切都很好。从那时起,我为Settings变量添加了一个Singleton类。我也想归档单身人士。我该怎么做?

令我困惑的部分是我打电话给同一条消息:

[NSKeyedArchiver archiveRootObject:singleton toFile:docPath];

当我打电话时,应用程序如何知道我想要取消归档哪个对象:

[NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

是阵列还是单身?

archiveRootObject接受一个(id),这意味着我想要的任何东西。我可以创建一个包含数组和单例的数据类。那是我怎么想这样做的?有没有更好的办法?欢迎任何建议。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果要在根级别编码多个对象,则需要自己使用+alloc-initForWritingWithMutableData:创建归档程序,将其发送给-encodeObject:forKey:要添加到存档的对象,最后是-finishEncoding。然后,您可以自己将数据写入文件。

它看起来像这样(警告:未经测试的代码):

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:someObject forKey:@"people"];
[archiver encodeObject:anotherObject forKey:@"places"];
[archiver encodeObject:thirdObject forKey:@"things"];
[archiver finishEncoding];

[data writeToURL:someUrl atomically:YES];
[archiver release];

要检索对象,您将完全相反:将文件读入NSData对象;使用+alloc-initForReadingWithData:创建一个NSKeyedUnarchiver;使用-decodeObjectForKey:检索您关心的对象;最后拨打-finishDecoding。您几乎可以从下到上阅读上面的示例,并进行一些名称更改。

答案 1 :(得分:3)

要成为可存档的,您的单例类必须符合NSCoding协议。您必须实施其initWithCoder:encodeWithCoder:方法。

如果您对具有相同文件路径的两个对象执行archiveRootObject:toFile:,那么您将覆盖其中一个。要编码两个对象,你必须做这样的事情,

NSData * data = [NSMutableData data];
NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:array forKey:@"Array"];
[archiver encodeObject:singleton forKey:@"Singleton"];
[archiver finishEncoding];
BOOL result = [data writeToFile:filePath atomically:YES];
[archiver release];

您可以在此guide了解有关存档的更多信息。