在NSKeyedArchiver中查找不同的实例

时间:2013-02-27 01:59:06

标签: objective-c memory nsarchiving

我目前正在使用此博客,它使用与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 个答案:

答案 0 :(得分:2)

您可以将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连接起来。