如何使用NSKeyedArchiver存档两个数组

时间:2012-12-11 20:22:35

标签: iphone objective-c nskeyedarchiver

我已经阅读了很多关于使用NSKeyedArchiver归档单个数组的知识。但是我如何保存两个数组呢?

我需要在UITabBarController中存储/检索两个视图控制器的数据。两个视图控制器中的每一个都创建相同自定义类的对象,但是将它们存储在每个视图控制器的单独数组中。

我当前的代码使用单独的方法来保存每个数组。问题是,在归档第二个数组时,它会覆盖第一个数组。我不能让他们两个都保存。我想我要么将两个数组保存到自己的文件中,要么将数据合并到一个文件中。我只是不确定如何为此编写代码。任何人都可以帮忙??

- (void)saveFermentableIngredients
{
    NSMutableData *fermentableData = [[NSMutableData alloc] init];
    NSKeyedArchiver *fermentableArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:fermentableData];
    [fermentableArchiver encodeObject:self.fermentableIngredients forKey:@"FermentableIngredients"];
    [fermentableArchiver finishEncoding];
    [fermentableData writeToFile:[self dataFilePath] atomically:YES];
}

- (void)saveHopIngredients
{
    NSMutableData *hopData = [[NSMutableData alloc] init];
    NSKeyedArchiver *hopArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:hopData];
    [hopArchiver encodeObject:self.hopIngredients forKey:@"HopIngredients"];
    [hopArchiver finishEncoding];
    [hopData writeToFile:[self dataFilePath] atomically:YES];
}

我应该提一下,我已经完成了通常的设置,实现了initWithCoder和encodeWithCoder方法。我怀疑问题确实出现在我上面发布的代码中。

3 个答案:

答案 0 :(得分:0)

如果您希望将所有这些数据存储在一起,那么您应该执行以下操作:

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCode encodeObject:self.fermentableIngredients forKey:@"FermentableIngredients"];
    [aCode encodeObject:self.hopIngredients forKey:@"HopIngredients"];
}

答案 1 :(得分:0)

我最终将每个数组保存到一个单独的文件中。首先,我声明了两个单独的文件路径:

- (NSString *)fermentableDataFilePath
{
    return [[self documentsDirectory] stringByAppendingPathComponent:@"Fermentables.plist"];
}

- (NSString *)hopDataFilePath
{
    return [[self documentsDirectory] stringByAppendingPathComponent:@"Hops.plist"];
}

然后我在我原始问题中添加的保存方法中引用了每个文件路径。所以在第一种方法中,我会写这样的writeToFile方法:

[fermentableData writeToFile:[self fermentableDataFilePath] atomically:YES];

答案 2 :(得分:0)

解决此问题的另一种方法是将两个(或更多)数组放入字典中。然后,您可以将字典存档到单个文件中,并使用您指定的键检索数组。您可以以这种方式存档多个项目,而无需借助NSCoder或创建多个存档。一个限制,因为它是一个字典,是你存储的值必须都是相同的类型。我已经以这种方式存档了SCNNode数组的字典,并且运行良好。