Использование NSKeyedArchiver для хранения пользовательской модели данных

Я работаю над 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, может быть, он немного скучный. Извините.

Ответы на вопрос(3)

Решение Вопроса

Поместите все записи, которые вы хотите сохранить вNSArray и используйте этот код:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries];

кудаentries это ваш массив записей. Легко и просто, всего одна строка кода.

Чтобы разархивировать, просто используйте

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedArchiver способен архивировать любую структуру данных, даже очень сложную, объектов Objective-Cthat implement the NSCoding protocolв том числе вложенныеNSArrays,NSDictionarys и пользовательские объекты в файл.NSKeyedUnarchiver делает наоборот, принимая любые данные, произведенныеNSKeyedArchiver и восстановление исходного графа объектов, который был заархивирован. Технически, они могли быть просто одним классом, но Apple решила разделить их по функциональности, потому что это более грамматически правильно или что-то в этом роде :)

Я предполагаю, что вы можете написать результатNSData Возьмите объект в файл и прочитайте его снова.

 20 окт. 2014 г., 07:17
Не знаю почему, но этот ответ работает, когда все остальные, которые кажутся идентичными, не благодарят

Вы можете хранить 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];

Для 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];

Ваш ответ на вопрос