Version 1.0 einer Anwendung verfügt über ein Datenmodell, das mit NSKeyed (Un) Archiver-Klassen gespeichert/geladen wird, da alle Modellklassen dem NSCoding-Protokoll entsprechen. Sagen Sie die folgende Hierarchie existiert:Programmgesteuertes Laden eines mit NSCoding erstellten Objektmodells
-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)
sagen, dass es Legacy-Dateien in einer solchen Weise gespeichert sind, müssen aber in der Version 2.0 der Anwendung für Rückwärtskompatibilität mit dem folgenden neueren Datenmodell geladen werden:
-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)
Offensichtlich fehlen einige Daten und müssen ausgefüllt werden. Für jede der zuvor vorhandenen "Anzahl der Bewohner" muss ein Grundobjekt "Bewohner" erstellt werden. Ich suche nach einer Möglichkeit, das vorherige Datenmodell programmgesteuert zu laden, insbesondere wenn ich nur eine Liste der Klassen/Hierarchien und nicht die .m/.h-Dateien selbst habe.
Also, was ich tun möchte, ist (vorausgesetzt, ich eine Datei Houses.data haben, die die Häuser Array serialisiert wurde):
NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];
Irgendwelche Ideen?
Es funktioniert irgendwie! Ein Problem ist, dass das "Houses" -Array zusammen mit einigen anderen Objekten in ein NSArray gewickelt wurde. Dies hat es einfach gemacht, ein Objekt zu serialisieren, indem Sie [NSKeyedArchiver archivedDataWithRootObject: (NSArray *) topLevelArray]; Um dies wieder zu erreichen, habe ich [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData]; Also wie kann ich die unarchiveObjectWithData: -Methode verwenden, da es eine Klassenmethode ist, mit einer Instanz eines benutzerdefinierten NSKeyedUnarchiver? –
Hey Craig! Die Klasse NSKeyedUnarchiver stellt die Klasse setClass: forClassName: sowohl auf der Klassen- als auch auf der Instanzebene zur Verfügung. Sie können also [NSKeyedUnarchiver setClass: forClassName:] sagen und dann [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData] verwenden. Sie können eine Instanz von NSKeyedUnarchiver erstellen, wenn Sie möchten, dies ist jedoch nicht erforderlich. Es sollte die Einstellungen verwenden, die Sie zuvor zur Verfügung gestellt haben. –