Question

La version 1.0 d'une application comporte un modèle de données, qui est enregistré / chargé à l'aide des classes NSKeyed (Un) Archiver, car toutes les classes de modèle adhèrent au protocole NSCoding. Disons que la hiérarchie suivante existe:

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

Dites que des fichiers existants sont stockés de cette manière, mais doivent être chargés dans la version 2.0 de l'application pour assurer la compatibilité ascendante, à l'aide du nouveau modèle de données suivant:

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

Évidemment, certaines données seront manquantes et devront être complétées. un "occupant" de base Un objet doit être créé pour chacun des "nombre de résidents". qui existait avant. Ce que je recherche, c’est un moyen de charger par programme le modèle de données précédent, en particulier si je ne dispose que d’une liste des classes / de la hiérarchie, et non des fichiers .m / .h eux-mêmes.

Donc, ce que je veux faire est (en supposant que je dispose d'un fichier Houses.data, qui a été sérialisé à l'aide du tableau Houses):

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

Des idées?

Était-ce utile?

La solution

Je pense que le truc ici consiste à utiliser la méthode setClass: forClassName: fournie par NSKeyedUnarchiver. Cela vous permet de dire: "Utilisez la classe TownHouse pour désérialiser toutes les occurrences de la classe House."

Ensuite, vous devez modifier la fonction initWithCoder: de votre TownHouse pour décoder l'une ou l'autre des hiérarchies. Pour ce faire, vous pouvez appeler decodeObject ou decodeObjectForKey: puis utiliser isKindOfClass: pour voir le type d'objet avec lequel vous traitez. Vous pouvez également utiliser containsValueForKey: pour vérifier certaines clés avant d'essayer de les lire.

J'espère que cela aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top