我目前正在編寫一個解析大量數據的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