NSCodingを使用して作成されたオブジェクトモデルをプログラムで読み込む
-
06-07-2019 - |
質問
アプリケーションのバージョン1.0にはデータモデルがあり、すべてのモデルクラスがNSCodingプロトコルに準拠しているため、NSKeyed(Un)Archiverクラスを使用して保存/ロードされます。次の階層が存在するとします:
-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)
このような方法で保存されたレガシーファイルがあるが、下位互換性のためにアプリケーションのバージョン2.0にロードする必要があるとします。次の新しいデータモデルを使用します。
-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)
明らかに、一部のデータが欠落しているため、入力する必要があります。基本的な「占有者」 「居住者の数」ごとにオブジェクトを作成する必要があります。以前に存在した。私が探しているのは、特に.m / .hファイル自体ではなくクラス/階層のリストしかない場合に、以前のデータモデルをプログラムで読み込む方法です。
だから私がやりたいのは(Houses配列を使用してシリアル化されたHouses.dataファイルがあると仮定して):
NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];
アイデアはありますか
解決
ここでの秘theは、NSKeyedUnarchiverが提供するsetClass:forClassName:関数を使用することだと思います。 "クラスTownHouseを使用して、クラスHouseのすべてのインスタンスをデシリアライズします。"
次に、いずれかの階層をデコードするためにTownHouseのinitWithCoder:関数を変更する必要があります。 decodeObjectまたはdecodeObjectForKey:を呼び出してからisKindOfClass:を使用して、処理しているオブジェクトのタイプを確認することでこれを実現できます。 containsValueForKey:を使用して、特定のキーを読み取ろうとする前にチェックすることもできます。
お役に立てばと思います!