Frage

Version 1.0 eine Anwendung hat ein Datenmodell, das gespeichert / geladen, um die NSKeyed (Un) Archiver-Klassen, da alle Modellklassen zum NSCoding Protokoll einzuhalten. Sagen Sie die folgende Hierarchie vorhanden ist:

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

, dass es Legacy-Dateien gespeichert in einer solchen Art und Weise, müssen aber für die Abwärtskompatibilität zu Version 2.0 der Anwendung geladen werden, mit dem folgenden neueren Datenmodell:

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

Natürlich werden einige Daten fehlen und werden. Zum Beispiel werden gefüllt müssen. ein grundlegendes „Bewohner“ Objekt muß für jede der „Einwohnerzahl“, das existierte, bevor geschaffen werden. Was ich suche ist eine Möglichkeit, programmatisch in dem vorherigen Datenmodell zu laden, vor allem, wenn ich nur eine Liste der Klassen / Hierarchie und nicht die .m / .h-Dateien selbst.

Also, was ich tun möchte, ist (vorausgesetzt, ich eine Datei Houses.data haben, die die Häuser Array serialisiert wurde mit):

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

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich denke, hier ist der Trick besteht darin, die setClass zu verwenden: forClassName: Funktion von NSKeyedUnarchiver zur Verfügung gestellt. Es ermöglicht Ihnen, zu sagen: „Klasse Townhouse Verwenden Sie alle Instanzen der Klasse Haus deserialisieren“

Dann müssen Sie Ihre Town initWithCoder ändern: Funktion entweder Hierarchie zu entschlüsseln. Sie könnten dies zu erreichen, indem decodeObject oder decodeObjectForKey Aufruf: und dann isKindOfClass mit: um zu sehen, welche Art von Objekt, das Sie mit zu tun haben. Sie können auch containsValueForKey benutzen. Für bestimmte Tasten zu überprüfen, bevor Sie versuchen, sie heraus zu lesen

Ich hoffe, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top