【问题标题】:UserDefaults/KeyedArchiver FrustrationsUserDefaults/KeyedArchiver 挫折
【发布时间】:2009-12-10 19:03:54
【问题描述】:

我正在开发一个家庭作业应用程序,该应用程序为每个作业使用自定义作业对象。我正在尝试将 NSMutableArray (通过 initWithArray 转换为 NSArray :) 存储在 standardUserDefaults 中,但我在保存和重新加载数组时遇到了麻烦。

我有一个表格视图,您可以从中选择添加新分配(加载 NewAssignmentViewController)。当您保存分配时,它会被推回到 AssigmentsViewController 中的一个数组中。然后每次加载显示分配的 UITableView 时调用它。

以下是相关代码:

-(void)saveToUserDefaults:(NSArray*)myArray{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"];
    [standardUserDefaults synchronize];
    }
}

-(void)retrieveFromUserDefaults{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"Assignments"]; 
if (dataRepresentingSavedArray != nil) {
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if ([oldSavedArray count] != 0) {
        [assignments setArray:[[NSMutableArray alloc] initWithArray:oldSavedArray]];
    }
    else {
        assignments = [[NSMutableArray alloc] initWithCapacity:100];
    }
}
}
 -(void)backButtonPressed {
[self saveToUserDefaults:[[NSArray alloc] initWithArray:assignments]];
[self.navigationController popViewControllerAnimated:YES];
}

请帮忙。它不会加载数组,但不会给出任何错误。任何有关 UserDefault 或 KeyedArchiver 的一般提示将不胜感激。

【问题讨论】:

    标签: iphone nsmutablearray nsuserdefaults nskeyedarchiver


    【解决方案1】:

    这里有几件事:

    如果我理解正确,您正在尝试存储一个数组,其内容是赋值对象。

    如果您想将这些对象序列化以存储到 NSUserDefaults 中,Assignment 对象本身需要通过覆盖这些方法来符合 NSCoding 协议:

    - (void)encodeWithCoder:(NSCoder *)encoder;
    - (id)initWithCoder:(NSCoder *)decoder;
    

    由于您没有发布您的分配对象的代码,不知道您是否正确或根本没有这样做。如果你有,你应该能够对对象进行编码。请参阅Archives and Serializations Programming Guide 了解更多信息。

    至于 NSUserDefaults,据我所知,您基本上是在尝试将应用程序的对象模型存储在那里。不是最好的主意。 NSUserDefaults 最适合用于轻量级持久数据:基本首选项、字符串、通用数据碎片。

    我要做的是将您的存档数据写到一个文件中,并在您的视图加载时加载它。

    以下是来自Beginning iPhone Development 的关于该主题的一些代码:

    从一个或多个符合 NSCoding 的对象创建存档相对容易。首先,我们创建一个 NSMutableData 实例来保存编码数据,然后创建一个 NSKeyedArchiver 实例来将对象归档到该 NSMutableData 实例中:

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

    在创建这两个之后,我们使用键值编码来归档我们希望包含在存档中的任何对象,如下所示:

    [archiver encodeObject:myObject forKey:@”keyValueString”];
    

    一旦我们编码了我们想要包含的所有对象,我们只需告诉归档器我们已经完成,将 NSMutableData 实例写入文件系统,并对我们的对象进行内存清理。

    [archiver finishEncoding]; BOOL success = [data writeToFile:@”/path/to/archive” atomically:YES]; 
    [archiver release]; 
    [data release];
    

    为了从档案中重构对象,我们经历了类似的过程。我们从归档文件创建一个 NSData 实例并创建一个 NSKeyedUnarchiver 来解码数据: NSData *data = [[NSData alloc] initWithContentsOfFile:path]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 之后,我们使用与存档对象相同的密钥从 unarchiver 读取对象:

    self.object = [unarchiver decodeObjectForKey:@”keyValueString”];
    

    您还需要获取 application's documents directory 以保存和加载文件。

    这是一本非常有用的书,充满了 sn-ps 代码。关于持久性的章节可能对您有所帮助。考虑一下,使用 Core Data 来完成这项任务可能会更开心。

    【讨论】:

      【解决方案2】:

      我不确定这是否能解决您的问题,但您不必将数组作为 NSData 从默认值中拉出。检查NSUserDefaults reference,您会发现数组是有效的默认对象。

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2017-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多