在 NSKeyedArchiver 中查找不同的实例

Posted

技术标签:

【中文标题】在 NSKeyedArchiver 中查找不同的实例【英文标题】:Finding different instances in NSKeyedArchiver 【发布时间】:2013-02-27 01:59:06 【问题描述】:

我目前正在使用这个博客,它使用与 NSKeyedArchiver 一起使用的自定义类。一切似乎都是正确的,但我想知道如何获得“学生”的不同实例。

http://keeptheseinmind.blogspot.com/2011/10/nskeyedarchiver-tutorial.html

在本教程中,每次终止应用程序时都会创建自定义类“students”的新实例。我假设在 NSKeyedArchiver 中有很多这样的“学生”实例,但我只能访问其中一个。

保存到磁盘

- (void)saveDataToDisk 
    NSString *path = @"~/Documents/data";
    path = [path stringByExpandingTildeInPath];

    NSMutableDictionary *rootObject;
    rootObject = [NSMutableDictionary dictionary];

    [rootObject setValue:student forKey:@"student"];

    [NSKeyedArchiver archiveRootObject:rootObject toFile:path];

从磁盘加载

- (void)loadDataFromDisk 
    NSString *path = @"~/Documents/data";
    path = [path stringByExpandingTildeInPath];

    NSMutableDictionary *rootObject;
    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    if ([rootObject valueForKey:@"student"]) 
        student = [rootObject valueForKey:@"student"];
    

编辑:

我弄错了,每次实例都相互覆盖,每次应用程序都被终止。有趣...

但是,我的目标仍然是在一个或多个 NSKeyedArchiver 中创建许多“学生”实例。任何想法将不胜感激。

【问题讨论】:

【参考方案1】:

您可以将NSKeyedArchiver 视为将对象(序列化)保存到磁盘的一种方式。在您的情况下,该对象是一个 NSDictionary,它只有一个键 student(我使用 JSON-ish 表示法来显示数据结构;希望意图很明确):

"student" :  "studentId" : 25,
              "studentName" : "John Smith"
            

正如您所注意到的,每次调用 saveDataToDisk 时,它只是覆盖了单个“学生”键。要拯救多个学生,您可以采取以下几种方法:您的选择将取决于您希望如何读回数据。

一种选择是存储一个数组,而不是NSDictionary

"student" : [  "studentId: 25, "studentName" : "John Smith" ,
               "studentId: 26, "studentName" : "Jane Doe"  ]

如果您采用这种方法,您需要确保saveDataToDisk 可以访问NSArray 的学生,并将该数组传递给rootObject setValue:

[rootObject setValue:students forKey:@"students"];

或者,您可以想象只想在字典中添加更多键,每个键代表一个学生:

"student25" :  "studentId: 25, "studentName" : "John Smith" ,
"student26" :  "studentId: 26, "studentName" : "Jane Doe" 

在这种情况下,您将再次需要确保您的保存函数可以访问一组学生,但这次您将遍历该数组,并使用您构造的自己的键将每个人添加到 rootDictionary通过(例如)将“student”与 studentId 连接起来。

【讨论】:

我想使用学生数组方法。但是,我想建立加班的学生人数;当我们想要归档它时,它不一定已经准备好。我想先查看archiveData文件中的学生,然后添加学生。我只是尝试通过取消归档(如果文件存在)然后在此之上进行归档来做到这一点,但现在似乎没有任何内容被存储。 但是,根据我的需要,刚刚尝试了新的密钥方法!穆乔·格拉西亚斯! :) 好主意! 并且......在得到它之后,我回到 NSMutableArray 并让它工作:)!首先,我将 NSMutableArray 设置为 rootObject 并使用 addObject 方法。在这种情况下不应该使用任何键。

以上是关于在 NSKeyedArchiver 中查找不同的实例的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 NSKeyedArchiver 在 UserDefaults 中保存自定义对象

从 NSKeyedArchiver 中提取 NSString

NSKeyedArchiver

NSKeyedArchiver 线程安全吗?

从表视图中删除行 | NSUserDefaults + NSKeyedArchiver

如何在 iOS 12 中替换 NSKeyedArchiver 的初始化程序 init(forWritingWith:) 来编码 CKRecord 的元数据