2009-06-23 4 views
0

Версия 1.0 приложения имеет модель данных, которая сохраняется/загружается с использованием классов архива NSKeyed (Un), поскольку все классы моделей придерживаются протокола NSCoding. Скажем, следующая иерархия существует:Программная загрузка объектной модели, созданной с использованием NSCoding

-> Houses (NSMutableArray) 
-> -> House (Custom Object) 
-> -> -> Color (3 ints, RGB) 
-> -> -> Number of Residents (int) 

сказать, что есть устаревшие файлы, сохраненные таким способом, но должны быть загружены в версии 2.0 приложения для обратной совместимости, используя следующую более новую модель данных:

-> Neighborhood (Maintains NSMutableArray, among other properties) 
-> -> TownHouse 
-> -> -> Color (3 ints, RGB) 
-> -> -> Occupants (NSMutableArray) 
-> -> (Other types of houses) 

Очевидно, что некоторые данные будут отсутствовать и их необходимо будет заполнить. для каждого из «числа жителей», который существовал раньше, должен быть создан базовый объект «Оккупант». То, что я ищу, - это способ программной загрузки в предыдущей модели данных, особенно если у меня есть только список классов/иерархии, а не самих файлов .m/.h.

Так что я хочу сделать, это (предполагая, что у меня есть файл Houses.data, который был сериализован используя массив домов):

NSFile *legacyFile; 
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile]; 

Любые идеи?

ответ

1

Я думаю, что трюк здесь заключается в использовании функции setClass: forClassName:, предоставленной NSKeyedUnarchiver. Это позволяет вам сказать: «Используйте класс TownHouse для десериализации всех экземпляров класса House».

Затем вам необходимо изменить функцию initWithCoder в TownHouse: для декодирования либо иерархии. Вы можете выполнить это, вызвав decodeObject или decodeObjectForKey: а затем с помощью isKindOfClass: посмотреть, с каким типом объектов вы имеете дело. Вы также можете использовать containsValueForKey: чтобы проверить определенные ключи, прежде чем пытаться их прочитать.

Я надеюсь, что это поможет!

+0

Это вид работ! Одна из проблем заключается в том, что массив «Дома» вместе с несколькими другими объектами был завернут в NSArray. Это упростило сериализацию одного объекта, вызвав [NSKeyedArchiver archivedDataWithRootObject: (NSArray *) topLevelArray]; Чтобы получить это обратно, я использовал [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData] ;. Так как я могу использовать метод unarchiveObjectWithData:, так как это метод класса с экземпляром пользовательского NSKeyedUnarchiver? –

+0

Эй, Крейг! Класс NSKeyedUnarchiver предоставляет функцию setClass: forClassName: как на уровне класса, так и на уровне экземпляра, поэтому вы можете сказать [NSKeyedUnarchiver setClass: forClassName:], а затем использовать [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData]. Вы можете создать экземпляр NSKeyedUnarchiver, если хотите, но это не требуется. Он должен использовать настройки, которые вы предоставили перед рукой в ​​любом случае. –

 Смежные вопросы

  • Нет связанных вопросов^_^