我从xml文件中读取数据,简化的NSDictionary
看起来像这样:
{
Name = "Song Title";
Album = "Album Title";
"Album Artist" = "Album Artist Title";
Artist = "Artist Title";
}, ...
我想制作模型ITSong
,ITArtist
,ITAlbum
,等等。
结构应该是智能的,所以我可以用ITComposer
或其他任何东西扩展它。
问题是模型是嵌套的
ITArtist
应该包含ITAlbum
个数组,而ITAlbum
应该包含ITSong
个数组。
这需要一堆嵌套的for循环,检查特定键的唯一NSString
,并且必须为专辑,艺术家,专辑艺术家等重复。这似乎不是一个很好的解决方案。
我想检查是否有可以执行此操作的库。而不是重新发明轮子。
如何以正确的方式将复杂的NSDictionary
映射到自定义模型?
感谢。
答案 0 :(得分:2)
RestKit(http://restkit.org,你还需要https://github.com/RestKit/RKXMLReaderSerialization)很好地将XML和JSON反序列化为Objective-C类。您可以定义XML和类之间的关系,它将自动创建对象。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我打赌有一个框架可以做到这一点,但接着Key-Value-Coding应该提供你需要的所有东西。我创建了一个基类,比如说ITObject带有使用setAttributesFromDictionary:
- (id)initWithDict:(NSDictionary *)dict {
if (self = [super init]) {
[self setAttributesFromDictionary:dict];
}
return self;
}
这将照顾您的所有正常属性。对于嵌套的dicts和数组,您只需实现(例如在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];
}
}
答案 3 :(得分:0)
为什么不考虑根据自定义数据集拥有XML文件然后拥有NSDictionary,请查看此处的一个示例... Simple XML to NSDictionary Converter