2013-02-21 66 views
0

我从XML文件中读取数据,并简化NSDictionary正在寻找这样的:映射一个嵌套的NSDictionary到自定义模型

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

我要让模特ITSongITArtistITAlbum,等等。
结构应该很聪明,所以我可以用ITComposer或其他什么来扩展它。

问题是模型是嵌套的。
ITArtist应该包含一个数组ITAlbum s,并且一个ITAlbum应该包含一个ITSong s的数组。

这将需要一堆嵌套的for-loops,检查特定键的唯一NSString s,并且必须为专辑,艺术家,专辑艺术家等重复。这似乎不是一个很好的解决方案。

而不是重新发明轮子,我想检查是否有一个库可以做到这一点。

如何将复杂NSDictionary映射到自定义模型的正确方法?

谢谢。

回答

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; 
} 
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]; 
    } 
}