Сохранение пользовательских объектов в plist с помощью 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 и вызывать их при повторном открытии приложения.

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


person Luke    schedule 11.09.2012    source источник


Ответы (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"]; – лукеч

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

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

а затем вы загружаете его с помощью:

self.dataController.masterGameList =
    [NSKeyedUnarchiver unarchiveObjectWithFile:myPlistFile];
person Jody Hagins    schedule 11.09.2012
comment
Я получаю сообщение об ошибке при попытке (я думаю) сказать, какой массив я хочу записать. Получение ожидаемого идентификатора в этой строке: [rootObject setValue:[self.dataController.masterGameList] forKey:@"games"]; - person Luke; 11.09.2012
comment
Является ли self.dataController.masterGameList корневым объектом графа объектов, который вы хотите сохранить? Если это так, вы должны заархивировать этот объект, например. NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.dataController.masterGameList]; - person FluffulousChimp; 11.09.2012

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

См. это руководство.

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