Программная загрузка объектной модели, созданной с использованием NSCoding
-
06-07-2019 - |
Вопрос
Версия 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: проверить определенные ключи, прежде чем пытаться их считывать.
Надеюсь, это поможет!