0

我从 xml 文件中读取数据,简化后NSDictionary如下所示:

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

我想做模型ITSong,,,,ITArtist等等ITAlbum
结构应该很聪明,所以我可以用ITComposer, 或其他方式扩展它。

问题是模型是嵌套的。应该保存一个 s 数组,
而an应该保存一个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

您的父模型对象应该负责初始化子对象。

让我们说 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

我敢打赌,有一个框架可以做到这一点,但是键值编码应该提供开箱即用的一切。我会创建一个基类,比如 ITObject 和一个使用setAttributesFromDictionary:

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

这将照顾你所有的正常财产。如果是嵌套的字典和数组,您只需实现(例如在 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 回答
0

您为什么不考虑根据您的自定义数据集拥有一个 XML 文件,然后拥有一个 NSDictionary ,请看这里的一个示例... Simple XML to NSDictionary Converter

于 2013-02-21T02:18:55.523 回答