私のiOSプロジェクト内でコアデータモデルを更新するために、私のモデルのマネージエンティティにある程度対応するJSONオブジェクトをサーバーに照会しています。私が目指している最終的な結果は、JSON出力からの信頼できるアップデートソリューションです。NSString型キーに基づいてプロパティの存在と型をテストする方法は?
この質問の例では、コアデータ管理オブジェクトの名前をexistingObj
とし、着信JSON逆シリアル化辞書の名前をupdateDict
とします。トリッキーな部分は、これらの事実を扱っている:existingObj
の
- ないすべてのプロパティが
updateDict
のすべてのプロパティはextistingObj
で利用できるわけではありませんupdateDict
- に存在しています。
existingObj
のプロパティのすべてのタイプがJSONの非直列化プロパティと一致するわけではありません。 (一部の文字列ではカスタムObjective-Cラッパーが必要な場合があります)。updateDict
には、existingObj
に初期化されていないキー(nil
)の値が含まれている場合があります。
これは、更新されたディクショナリを繰り返し実行している間に、プロパティのテストを前後に行う必要があることを意味します。
// key is an NSString, e.g. @"displayName"
if ([existingObj respondsToSelector:NSSelectorFromString(key)) {
[existingObj setValue:[updateDict objectForKey:key] forKey:key];
}
この部分は動作しますが、私は私が実際だという事実が好きではない:まず、私はupdateDict
の性質のようなので、私はKVCを使用して値を設定し、existingObj
に存在するかどうかをテストする必要がありますゲッターとしてdisplayName
のテスト、私はsetDisplayName:
セッター(KVC経由で間接的に)に電話しようとしています。私はむしろ[existingObj
hasWritablePropertyWithName
:key]のようなものですが、これは私が見つけることができないものです。
これはサブクエリションのためのものです。A:あなたはプロパティの名前しか持っていない場合、プロパティセッターをどのようにテストしますか?
次の部分は、その種類に基づいてプロパティの識別を自動化したい部分です。 updateDict
とexistingObj
の両方にkey @ "displayName"のNSStringがある場合、新しい値の設定は簡単です。しかし、updateDict
に@ "niceShadeOfGreen"というキー@ "color"のNSStringが含まれている場合は、これを正しいUIColorインスタンスに変換したいと思います。しかし、どのように私はexistingObj
の受信プロパティの型をテストするので、いつ値を変換するのか、そしていつ割り当てるのですか?私は
typeOfSelectorの線に沿って何かを期待していた。もちろん
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else {
// perform custom assignment
}
これはboguscodeです。私はexistingObj
のプロパティの値の型をテストすることに頼ることはできません。それはunitializedまたはnil
かもしれません。
サブクラスB:プロパティの名前のみを持つ場合、プロパティのタイプをテストするにはどうすればよいですか?
私はそれだと思います。私はこれが既にここにある何かのものでなければならないと考えましたが、私はそれを見つけることができませんでした。多分あなたたちはできますか?
乾杯、EP。
P.S.カスタムObjective-Cオブジェクトを直列化されていないJSONオブジェクトに同期させるより良い方法がある場合は、共有してください!結局のところ、結果は何を意味します。
あなたが知っている*キーに対して 'updateDict'を問い合わせて、残りの部分はすべて無視することをお勧めします。 – Costique
上記の例から、実際に実行可能なオプションです。しかし現実のシナリオでは、これは管理対象オブジェクトに変更を加え、非常に複雑な更新を行います。オブジェクトは30以上のキー/プロパティで構成され、そのほとんどはNSStringまたはNSNumberです。上記の問題に対する解決策がある場合、両方のプリミティブ型が追加または変更されても、同期化は修正する必要はありません。 – epologee