3

次のコードがあります-xmlファイルを読み取るメソッド。しかし、それは私にとって非常に遅いです。データをより速くフェッチして読み取るための十分な方法はありませんか。

if(connectionRemaining)
{
    [self LoadingPopUp];
    NSURL *tmpURl=[NSURL URLWithString:[NSString stringWithFormat:@"%@getcategory.php",[iGolfAppDelegate getServerPath]]];
    NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:tmpURl];
    NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if(conn)
        myWebData=[[NSMutableData data] retain];
    connectionRemaining=NO;
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[myWebData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[myWebData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[connection release];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
//  NSString *theXML = [[NSString alloc] initWithBytes: [myWebData mutableBytes] length:[myWebData length] encoding:NSUTF8StringEncoding];
//  NSLog(@"%@",theXML);[theXML release];   
if( myXMLParser )
    [myXMLParser release];
myXMLParser = [[NSXMLParser alloc] initWithData: myWebData];
[myXMLParser setDelegate: self]; [myXMLParser setShouldResolveExternalEntities: YES];
[myXMLParser parse];[connection release];[myWebData release];
}

#pragma mark
#pragma mark XMLParsing Methods
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict {
if([elementName isEqualToString:@"category"])
    categoryArray=[[NSMutableArray alloc]init];
else if([elementName isEqualToString:@"Prop_Category"])
    aCategory=[[Category alloc] init];
}

-(void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string {
if(!currentElementValue)
    currentElementValue=[[NSMutableString alloc] initWithString:string];
else
    [currentElementValue appendString:string];
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName {
if([elementName isEqualToString:@"category"])
{ [LoadingAlert dismissWithClickedButtonIndex:0 animated:YES]; [LoadingAlert release];[self categoryPickerDiplay]; return;  }
else if([elementName isEqualToString:@"Prop_Category"])
{ [categoryArray addObject:aCategory];[aCategory release];aCategory=nil; }
else{   
    [aCategory setValue:currentElementValue forKey:elementName];
    [currentElementValue release];currentElementValue=nil;
}

}

私の質問をもう一度明確にさせてください。

この xml の読み取り方法では不十分であることがわかりました。この方法を使用すると、iPhone のデータのロードが非常に遅くなります。なぜなら、iPhoneは毎回各タグを読み取って比較するからです。

より高速な XML の読み込みと解析が必要です。

あなたの知識を私と共有してくれてありがとう

4

3 に答える 3

3

libxml と NSXMLParserのパフォーマンスを示す XMLPerformance呼ばれる Apple の例があります。libxml の実装を確認してください。

于 2009-09-11T18:10:33.177 に答える
2

adcのSiesmicXMLおよびTopSongsコードサンプルは、最小限のユーザー待機時間を引き起こすXMLを解析するいくつかの方法を示しています。

于 2009-09-11T18:00:59.793 に答える
2

libxml Cライブラリ、またはそのためのTouchXMLラッパーを見たことがありますか?また、速度低下の原因となっているのはNSXMLParserであると確信していますか?InstrumentsまたはSharkを使用して簡単なランスルーを実行し、アプリケーションのプロファイルを作成してホットスポットを見つけることができます。

于 2009-09-11T18:07:46.160 に答える