2013-02-21 70 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]; 
    } 
}