Сохранение пользовательских объектов в список с помощью 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
восстановить граф объекта.
Посмотреть этот урок