Программная загрузка объектной модели, созданной с использованием NSCoding

StackOverflow https://stackoverflow.com/questions/1030467

Вопрос

Версия 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)

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

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

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

Есть идеи?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top