Сохранение пользовательских объектов в список с помощью NSCoder

Итак, я понял, что мне нужно использовать NSCoding для сохранения моих пользовательских объектов в plist.

Часть, с которой я борюсь, это именно то, как я делаю это после того, как я реализовал initWithCoder а также encodeWithCoder методы. Они вернулись id а также void соответственно, поэтому, если они преобразовали мои объекты в NSData или что-то еще с ними, где данные, чтобы я мог сохранить их?

У меня есть методы, настроенные таким образом:

- (id)initWithCoder:(NSCoder *)decoder { // Decode
    if (self = [super init]) {
        self.name = [decoder decodeObjectForKey:@"gameName"];
        self.genre = [decoder decodeObjectForKey:@"gameGenre"];
        self.rating = [decoder decodeObjectForKey:@"gameRating"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder { // Encode
    [encoder encodeObject:self.name forKey:@"gameName"];
    [encoder encodeObject:self.genre forKey:@"gameGenre"];
    [encoder encodeObject:self.rating forKey:@"gameRating"];
}

Попытка выяснить, каковы следующие шаги, чтобы эти объекты (которые уже находятся в NSMutableArray) были сохранены в.plist и вызваны при повторном открытии приложения.

Любая помощь приветствуется!

2 ответа

Решение

Ну, это зависит от того, что вы хотите сделать. Возможно, что NSKeyedArchiver будет достаточно. Рассматривать:

+ (NSData *)archivedDataWithRootObject:(id)rootObject
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path

который берет корневой объект графа объектов и либо создает объект NSData с сериализованными данными, либо сериализует данные в файл.

Тогда посмотрите на NSKeyedUnarchiver который имеет эти:

+ (id)unarchiveObjectWithData:(NSData *)data
+ (id)unarchiveObjectWithFile:(NSString *)path

Я уверен, что это поможет вам достичь цели.

РЕДАКТИРОВАТЬ

Я получаю сообщение об ошибке при попытке (я думаю) сказать ему, какой массив я хочу, чтобы он записал. Получение "Ожидаемого идентификатора" в этой строке: [rootObject setValue:[self.dataController.masterGameList] forKey:@"games"]; - лучеч

Это API KVC. Методы архивирования / разархивирования являются методами класса, поэтому вы просто сохраняете весь граф объектов с помощью:

if (![NSKeyedArchiver archiveRootObject:self.dataController.masterGameList
                                 toFile:myPlistFile]) {
    // Handle error
}

а затем вы загружаете его с:

self.dataController.masterGameList =
    [NSKeyedUnarchiver unarchiveObjectWithFile:myPlistFile];

Вам нужно будет реализовать NSKeyedArchiver на корневой объект вашего графа объекта, чтобы сохранить, а затем NSKeyedUnarchiver восстановить граф объекта.

Посмотреть этот урок

Другие вопросы по тегам