Программная загрузка объектной модели, созданной с использованием NSCoding - PullRequest
0 голосов
/ 23 июня 2009

Приложение версии 1.0 имеет модель данных, которая сохраняется / загружается с использованием классов NSKeyed (Un) Archiver, поскольку все классы модели придерживаются протокола 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)

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

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

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

Есть идеи?

1 Ответ

1 голос
/ 23 июня 2009

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

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

Надеюсь, это поможет!

...