Pregunta

La versión 1.0 de una aplicación tiene un modelo de datos, que se guarda / carga utilizando las clases NSKeyed (Un) Archiver, ya que todas las clases de modelos se adhieren al protocolo NSCoding. Digamos que existe la siguiente jerarquía:

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

Digamos que hay archivos heredados almacenados de esa manera, pero que deben cargarse en la versión 2.0 de la aplicación para una compatibilidad con versiones anteriores, utilizando el siguiente modelo de datos más reciente:

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

Obviamente, faltarán algunos datos y deberán completarse. Ej. un "Ocupante" básico deberá crearse un objeto para cada uno de los " número de residentes " que existía antes Lo que estoy buscando es una forma de cargar mediante programación el modelo de datos anterior, especialmente si solo tengo una lista de las clases / jerarquía, y no los archivos .m / .h en sí.

Entonces, lo que quiero hacer es (suponiendo que tenga un archivo Houses.data, que se serializó utilizando la matriz de Casas):

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

¿Alguna idea?

¿Fue útil?

Solución

Creo que el truco aquí es usar la función setClass: forClassName: proporcionada por NSKeyedUnarchiver. Le permite decir: " Use class TownHouse para deserializar todas las instancias de class House. & Quot;

Entonces necesita modificar la función initWithCoder: de su TownHouse para decodificar cualquiera de las jerarquías. Puede lograr esto llamando a decodeObject o decodeObjectForKey: y luego usando isKindOfClass: para ver qué tipo de objeto está tratando. También puede usar usesValueForKey: para verificar ciertas claves antes de intentar leerlas.

¡Espero que eso ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top