2

我已经阅读了很多关于使用 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 方法。我怀疑问题确实出在我上面发布的代码中。

4

3 回答 3

0

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

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCode encodeObject:self.fermentableIngredients forKey:@"FermentableIngredients"];
    [aCode encodeObject:self.hopIngredients forKey:@"HopIngredients"];
}
于 2012-12-11T22:23:26.027 回答
0

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

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

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

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

[fermentableData writeToFile:[self fermentableDataFilePath] atomically:YES];
于 2012-12-13T20:18:28.187 回答
0

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

于 2016-02-14T17:42:43.567 回答