10

我正在开发一个 RSS 阅读器。它只是一个表格视图,每个单元格显示一个自定义数据模型 RSSEntry。我有一个 NSMutableArray allEntries,其中包含我从服务器获得的所有 RSSEntry。这是 RSSEntry 的样子:

    @interface RSSEntry : NSObject <NSCoding> {
        NSString *_blogTitle;
        NSString *_articleTitle;
        NSString *_articleUrl;
        NSDate *_articleDate;
    }

我想从本地存档中恢复数据,因此当我退出并再次打开此应用程序时,表格视图会在上次刷新时填充数据。

我已经阅读了“开始 iOS5 编程”中的示例,但它只存储和恢复一个数据模型。所以我不知道如何存储这个充满我的自定义数据模型的可变数组并恢复它。

我使用以下代码来存储和恢复数据:

// STORE
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:entry forKey:kDataKey];
[archiver finishEncoding];

// RESTORE
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath:kFilename]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
RSSEntry *entries = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];

我只能以这种方式存储和恢复一个数据模型。

谁能帮我一把。我是 iOS 编程新手,可能有点乏味。抱歉。

4

3 回答 3

21

将您要存储的所有条目放入NSArray并使用以下代码:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries];

entries您的条目数组在哪里。简单易用,只需一行代码。

要取消归档,只需使用

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedArchiver能够将实现NSCoding协议的 Objective-C 对象的任何数据结构,甚至是非常复杂的数据结构,包括嵌套NSArray的 s、NSDictionarys 和自定义对象,归档到文件中。NSKeyedUnarchiver做相反的事情,获取NSKeyedArchiver由归档的原始对象图产生的任何数据并重新建立。从技术上讲,它们可能只是一个类,但 Apple 决定按功能将它们分开,因为这在语法上更正确或其他什么:)

我假设您能够将生成的NSData对象写入文件,然后再次读回。

于 2012-06-07T11:20:06.603 回答
6

您可以按以下方式存储 NSDictionary

NSDictionary *Your_NSDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"Obj1", @"Key1",
                               @"Obj2", @"Key2", nil];
//store dictionary
NSMutableData *yourData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:yourData];
[archiver encodeObject:Your_NSDictionary forKey: @"key"];
archiver finishEncoding];
[yourData writeToFile:@"FilePath" atomically:YES];
[yourData release];
[archiver release];


//Load dictionary

NSData *yourData = [[NSMutableData alloc]initWithContentsOfFile:@"FilePath"];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:yourData];
Your_NSDictionary = [unarchiver decodeObjectForKey: @"key"];
[unarchiver finishDecoding];
[unarchiver release];
[yourData release];
于 2012-06-07T09:39:09.450 回答
2

对于 iOS 12:

对于archivedDataWithRootObject

NSData *myDicData = [NSKeyedArchiver archivedDataWithRootObject:AllDataDic 
                                     requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:myDicData forKey:@"Yourkey"];

对于unarchivedObjectOfClass

NSData *tempData = [[NSUserDefaults standardUserDefaults] valueForKey:@"Yourkey"];
NSDictionary *myDicProfile = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] 
                                                fromData:tempData error:nil];
于 2018-10-16T16:02:21.427 回答