首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UserDefaults/KeyedArchiver挫折

UserDefaults/KeyedArchiver挫折
EN

Stack Overflow用户
提问于 2009-12-11 03:03:55
回答 2查看 991关注 0票数 3

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

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

相关代码如下:

代码语言:javascript
复制
-(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的一般技巧都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2009-12-11 18:18:50

这里有几件事:

如果我没理解错的话,您正在尝试存储一个其内容是assignment对象的数组。

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

代码语言:javascript
复制
- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder;

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

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

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

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

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

代码语言:javascript
复制
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

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

代码语言:javascript
复制
[archiver encodeObject:myObject forKey:@”keyValueString”];

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

代码语言:javascript
复制
[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];之后,我们使用用于归档对象的相同密钥从未归档程序读取对象:

代码语言:javascript
复制
self.object = [unarchiver decodeObjectForKey:@”keyValueString”];

您还需要让您的application's documents directory保存和加载文件。

这是一本非常有用的书,里面有大量的代码片段。关于持久性的章节可能会对您有所帮助。想想看,使用Core Data来完成这项任务可能会更愉快。

票数 2
EN

Stack Overflow用户

发布于 2009-12-11 03:25:03

我不确定这是否能解决您的问题,但您不必将数组从默认的NSData中提取出来。检查NSUserDefaults reference,您将看到数组是有效的默认对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1883231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档