2009-06-23 11 views
0

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?

Antwort

1

Ich denke, der Trick hier ist die setClass: forClassName: Funktion von NSKeyedUnarchiver zur Verfügung gestellt. Es erlaubt Ihnen zu sagen: "Verwenden Sie die Klasse TownHouse, um alle Instanzen der Klasse House zu deserialisieren."

Dann müssen Sie die InitWithCoder: -Funktion Ihres TownHouse ändern, um eine der beiden Hierarchien zu dekodieren. Sie können dies erreichen, indem Sie decodeObject oder decodeObjectForKey aufrufen und dann isKindOfClass verwenden: um zu sehen, mit welchem ​​Objekttyp Sie es zu tun haben. Sie können auch containsValueForKey verwenden: um nach bestimmten Schlüsseln zu suchen, bevor Sie versuchen, sie auszulesen.

Ich hoffe, dass hilft!

+0

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? –

+0

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. –

Verwandte Themen