0

xmlファイルからデータを読み取りましたが、簡略化すると次のNSDictionaryようになります。

{
    Name = "Song Title";
    Album = "Album Title";
    "Album Artist" = "Album Artist Title";
    Artist = "Artist Title";
}, ...

ITSongモデル、、、などITArtistを作りたいですITAlbum
構造はスマートである必要があるので、、などで拡張できITComposerます。

問題は、モデルがネストされていることです。はsの配列を保持する必要があり、はsの
配列を保持する必要があります。ITArtistITAlbumITAlbumITSong

これには、ネストされたforループの束が必要でありNSString、特定のキーの一意のsをチェックし、アルバム、アーティスト、アルバムアーティストなどに対して繰り返す必要があります。これはあまり良い解決策ではないようです。

車輪の再発明をする代わりに、これを実行できるライブラリがあるかどうかを確認したいと思います。

NSDictionaryコンプレックスをカスタムモデルに正しい方法でマッピングするにはどうすればよいですか?

ありがとう。

4

4 に答える 4

2

RestKit(http: //restkit.org、https ://github.com/RestKit/RKXMLReaderSerializationも必要です)は、XMLとJSONをObjective-Cクラスに逆シリアル化するのに適しています。XMLとクラスの関係を定義すると、オブジェクトが自動的に作成されます。

于 2013-02-21T01:41:47.940 に答える
0

カスタムデータセットに従ってXMLファイルを作成し、次にNSDictionaryを作成することを考えてみませんか。ここで、1つの例を見てください...単純なXMLからNSDictionaryへのコンバーター

于 2013-02-21T02:18:55.523 に答える
0

親モデルオブジェクトは、子オブジェクトの初期化を処理する必要があります。

ITArtistのために言うことができます

-(id)initWithDictionary:(NSDictionary*)artistDictionary {
    self = [super init];
    if (self) {
        self.artistName = [artistDictionary valueForKey:@"name"];
        NSMutableArray *albumObjects = [NSMutableArray new];
        NSArray *albumDicts = [artistDictionary valueForKey:@"albums"];
        for each albumDict {
               ITAlbum *albumModelObject = [[ITAlbum alloc] initWithDictionary:albumDict];//This should take care of initializing the songs
              [albumObjects addObject:albumModelObject];
               [albumModelObject release];
        }
       self.albums =  albumObjects;
       [albumObjects release];
    }
    return self;
}
于 2013-02-21T01:38:55.040 に答える
0

それを行うフレームワークがあると思いますが、Key-Value-Codingは、必要なものすべてをすぐに提供できるはずです。基本クラスを作成します。たとえば、ITObjectを使用するイニシャライザーを使用します。setAttributesFromDictionary:

- (id)initWithDict:(NSDictionary *)dict {
    if (self = [super init]) {
        [self setAttributesFromDictionary:dict];
    }
    return self;
}

それはあなたのすべての通常のプロパティの世話をします。ネストされたdictと配列の場合、(たとえばITArtist:ITObjectで)実装するだけです。

- (void)setValue:(id)value forKey:(NSString *)key {
    if ([key isEqualToString:@"albums"]) {
        if ([value isKindOfClass:[NSArray class]]) {
            NSMutableArray *myMembers = [NSMutableArray arrayWithCapacity:[value count]];
            for (id valueMember in value) {
                ITAlbum *album = [[[ITAlbum alloc] initWithDict:valueMember] autorelease];
                [myMembers addObject:album];
            }
            self.albums = myMembers;
        }
    } else {
        [super setValue:value forKey:key];
    }
}
于 2013-02-21T01:41:32.153 に答える