我目前正在编写一个解析大量数据的XML解析器,其中包含许多不同的节点(XML不是由我设计的,我无法控制内容......)Objective-C实现指针
无论如何,它目前需要很长时间才能下载和阅读(大约13秒),所以我正在寻找提高阅读效率的方法。
我已经写了一个函数来创建哈希值,以便程序不再需要做很多字符串比较(只是NSUInteger比较),但这仍然不降低读取的复杂度。 。
所以我想也许我可以创建IMP的数组,这样,我可以然后去是这样的:
for(int i = 0; i < [hashValues count]; i ++)
{
if(currHash == [[hashValues objectAtIndex:i] unsignedIntValue])
{
[impArray objectAtIndex:i];
}
}
或类似的东西。
唯一的问题是,我不知道如何实际调用IMP函数?
我不过看了我进行选择,一个IMP定义了去
IMP tImp = [impArray objectAtIndex:i];
tImp(self, @selector(methodName));
,如果我需要知道选择的名字呢,有什么意义呢?
有人能帮我解决我想做的事吗?甚至只是一些方法来提高解析器的效率......
下面是我的NSXMLParser委托一些摘录: 从didStartElement
if([elementName isEqualToString:@"playingFilmData"])
{
appDelegate.arrPlayingFilms = [[NSMutableArray alloc] init];
appDelegate.arrSessionTimes_ByFilm = [[NSMutableArray alloc] init];
appDelegate.arrSessionTimes_ByCinema = [[NSMutableArray alloc] init];
[self releaseData];
return;
}
else if([elementName isEqualToString:@"film_sessions"])
{
aFilm.arrSessions = [[NSMutableArray alloc] init];
[self releaseData];
return;
}
else if([elementName isEqualToString:@"session"])
{
aSession = [[ATM_SessionObject alloc] init];
aSession.session_filmID = aFilm.film_id;
[self releaseData];
return;
}
else if([elementName isEqualToString:@"sess"])
{
aFilm.arrSessions = [[NSMutableArray alloc] init];
[self releaseData];
return;
}
else if([elementName isEqualToString:@"cin"])
{
cinID = [attributeDict objectForKey:@"id"];
[self releaseData];
return;
}
else if([elementName isEqualToString:@"s"])
{
aSession = [[ATM_SessionObject alloc] init];
aSession.session_filmID = aFilm.film_id;
aSession.session_cinemaID = cinID;
[self releaseData];
return;
}
else if([elementName isEqualToString:@"flm"])
{
aFilm = [[ATM_FilmObject alloc] init];
aFilm.film_id = [attributeDict objectForKey:@"id"];
aFilm.film_epNum = 0;
[self releaseData];
return;
}
[self releaseData];
从didEndElement
/*
*0 = nowShowing_lastUpdate
*1 = s
*2 = tit
*3 = des
*4 = rate
*5 = dir
*6 = act
*7 = rel
*8 = flm
*/
NSUInteger numHash = [appDelegate murmerHashKey:elementName WithLegth:[elementName length] AndSeed:42];
if(currentElementValue)
{
if(numHash == [[hashValues objectAtIndex:0] unsignedIntValue])
{
appDelegate.strNowShowingUpdate = currentElementValue;
self releaseData];
return;
}
else if(numHash == [[hashValues objectAtIndex:1] unsignedIntValue])
{
[aFilm.arrSessions addObject:aSession];
[appDelegate.arrSessionTimes_ByFilm addObject:aSession];
[aSession release];
aSession = nil;
}
else if(numHash == [[hashValues objectAtIndex:2] unsignedIntValue])
{
[aFilm setValue:currentElementValue forKey:@"film_title"];
[self releaseData];
return;
}
else if(numHash == [[hashValues objectAtIndex:3] unsignedIntValue])
{
[aFilm setValue:currentElementValue forKey:@"film_description"];
[self releaseData];
return;
}
else if(numHash == [[hashValues objectAtIndex:4] unsignedIntValue])
{
[aFilm setValue:currentElementValue forKey:@"film_rating"];
[self releaseData];
return;
}
else if(numHash == [[hashValues objectAtIndex:5] unsignedIntValue])
{
[aFilm setValue:currentElementValue forKey:@"film_directors"];
[self releaseData];
return;
}
else if(numHash == [[hashValues objectAtIndex:6] unsignedIntValue])
{
[aFilm setValue:currentElementValue forKey:@"film_actors"];
[self releaseData];
return;
}
}
if(numHash == [[hashValues objectAtIndex:8] unsignedIntValue])
{
[appDelegate.arrPlayingFilms addObject:aFilm];
[aFilm release];
aFilm = nil;
[self releaseData];
return;
}
[self releaseData];
希望这有助于更清楚地表明我做错了什么。就像我所说的,我是这个编程领域的新手(实际上,我实际上是一名数学家,而不是一名训练有素的程序员),所以我非常热衷于学习不该做什么!
你可以发布这个XML的例子吗?你正在做的事情几乎肯定不是做这件事的最好方式。 – 2010-04-30 00:33:32
XML数据的一个例子可以在这里找到:http://rangers.theprojectfactory.com/_source/ATM_Data_NowShowing.xml – 2010-04-30 00:42:21
我很困惑,为什么你认为需要知道选择器否定IMP缓存的整个点。 IMP缓存通常是一种微型优化,可以避免方法查找的开销 - 它不是绕过传递选择器参数的方式。另外,这对于在Objective-C中实现XML解析器的具体问题没有帮助,但我认为你会发现Core Foundation XML解析器比NSXMLParser快很多。 – Chuck 2010-04-30 01:50:27