14

WebサービスからいくつかのJSONを解析します。これにより、NSDictionaryが得られます。このディクショナリを使用して、NSObjectタイプのvalueEntityにプロパティを入力します。

[myObject setValuesForKeysWithDictionary:JSONDict];

(myObjectには、JSONパーサーのディクショナリと同じプロパティ名とタイプがあります)

name = name
count = count
startDate = startDate
etc..

NSObjectサブクラスのプロパティとその値を「埋める」NSDictionaryがある場合、別の方法はありますか。タイトルで提案しているように、これに沿った何か:

一方通行

MyObject *myObject = [[MyObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

逆に

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];

これは、プロトコルによってすべてのビューが準拠するvalueEntityがありますが、NSManagedObjectにも値を入力したいためです。したがって、中間ステップとしてNSDictionaryを使用すると、NSObjectをサブクラス化するオブジェクトの値から各プロパティを手動で設定するNSManagedObjectでカテゴリを実行する必要がなくなると思いました。

辞書で私は行くことができます:

[myManagedObject setValuesForKeysWithDictionary:dict];

上記を実行すると、辞書表現を元に戻すことができませんか?

4

3 に答える 3

17

はい、方法は次のとおりです。

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys

関心のあるオブジェクトプロパティを表すキーの配列を渡し、プロパティ値を含むディクショナリを取得します。

このNSKeyValueCodingプロトコルは、強力で非常に便利な方法をいくつか定義しています。慣れることは素晴らしいことです。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

非常に価値のあるコンパニオンガイドもあります。

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

于 2010-09-14T19:18:23.923 に答える
5

本当にすべてのプロパティを取得しますか?多くの場合、オブジェクトのすべてのプロパティをディクショナリとして取得することは意味がありません。たとえば、NSManagedObjectに関係が含まれている場合、それも辞書に入れますか?もしそうなら、あなたはそれをどのように表現したいですか?

jlehrが言ったように、を使用してキーのセットを明示的にフィードすることをお勧めしdictionaryWithValuesForKeys:ます。

とはいえ、恐ろしいObjective-Cランタイムを使用すると、実際にを実装できますmakeDictionaryWithObjectPropertiesclass_getPropertyListproperty_getNameを使用します。このアプローチに従うと、自分が何をしているのかがわかるので、その方法については詳しく説明しません。

ちなみに、JSONインターネットから返されたオブジェクトNSManagedObjectをusingに割り当てるのは非常に危険ですsetValuesForKeysWithDictionary:。なぜなら、JSONオブジェクトに予期しない追加のキーが含まれていると、コードが突然クラッシュする可能性があるためです。だから、それをしないでください

別のコメント:あなたの擬似コード

NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

あまり意味がありません:はい、あなたはsetValuesForKeysWithDictionary:反対することができますが、バニラへのエントリのいずれもNSObjectできないので、それは惨めに失敗します。ご存知だと思いますが、このページに出くわした初心者がだまされないように、はっきりと言いたいと思います。setValue:forKey:JSONDictNSObject

于 2010-09-14T19:23:49.700 に答える
1

この男は、ランタイムマジックを使用して、オブジェクトで宣言されたすべてのプロパティを取得し、プロパティ名を手動で指定せずに辞書を取得しました。

そして、私が見つけたこの素晴らしいgithubリポジトリもあります。それらはほとんど同じトリックを実行しますが、素晴らしいパッケージになっています。また、オブジェクトからjsonまたはplistを作成する機能もあります。

于 2011-12-19T20:58:24.413 に答える