2012-06-07 22 views
8

我正在使用rss閱讀器。它只是一個tableview,每個單元顯示一個自定義數據模型RSSEntry。我有一個NSMutableArray allEntries,它包含我從服務器獲得的所有RSSEntry。這是RSSEntry樣子:使用NSKeyedArchiver存儲自定義數據模型

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

我想,當我退出並再次打開該應用程序以恢復本地歸檔數據是這樣,tableview中填充了數據時,最後一次刷新。

我在「開始的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編程的新手,可能有點沉悶。

回答

14

將所有要存儲到NSArray,並使用此代碼的條目:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries]; 

哪裏entries是你的條目陣列。很好很容易,只需一行代碼。

要解除封存,只是使用

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSKeyedArchiver是能夠存檔Objective-C中的任何數據結構,即使是非常複雜的,對象實現該NSCoding協議,包括嵌套NSArray S,NSDictionary s和自定義對象添加到文件中。 NSKeyedUnarchiver做了相反的處理,獲取了NSKeyedArchiver產生的任何數據並重建了歸檔的原始對象圖。從技術上講,他們可能只是一個類,但蘋果決定通過功能來區分它們,因爲這在語法上更加正確或者是某種東西:)

我假設您能夠將生成的NSData對象寫入文件並讀取它再次回來。

+0

不知道爲什麼,但這個答案適用於所有其他似乎完全不同的人 - 謝謝 –

3

你可以存儲一個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]; 
相關問題