10

私はRSSリーダーに取り組んでいます。これは単なるテーブル ビューであり、各セルにはカスタム データ モデル RSSEntry が表示されます。そして、サーバーから取得したすべての RSSEntry を含む NSMutableArray allEntries があります。RSSEntry は次のようになります。

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

ローカル アーカイブからデータを復元したいので、このアプリを終了して再度開くと、最後の更新時にテーブルビューにデータが入力されます。

「Beginning iOS5 Programming」の例を読みましたが、1 つのデータ モデルのみを保存および復元するだけです。したがって、この変更可能な配列をカスタム データ モデルでいっぱいに保存して復元する方法がわかりません。

次のコードを使用して、データを保存および復元します。

// 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];

この方法で保存および復元できるデータ モデルは 1 つだけです。

誰が私に手を貸してくれますか。私は iOS プログラミングに慣れていないので、少し退屈かもしれません。

4

3 に答える 3

21

保存するすべてのエントリを に配置し、次のNSArrayコードを使用します。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries];

entriesエントリの配列はどこにありますか。1 行のコードで簡単に作成できます。

アーカイブを解除するには、使用するだけです

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedArchiverネストされた 、 、およびカスタム オブジェクトを含む、プロトコルを実装する Objective-C オブジェクトの非常に複雑なデータ構造であっても、ファイルアーカイブNSCodingできます。によって生成されたデータを取得し、アーカイブされた元のオブジェクト グラフを再構築します。技術的には、それらは単一のクラスである可能性がありますが、Apple は機能によってそれらを分離することを決定しました。NSArrayNSDictionaryNSKeyedUnarchiverNSKeyedArchiver

結果のオブジェクトをファイルに書き込んで、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 に答える