Objective c NSURL连接&;UIProgressView

Objective c NSURL连接&;UIProgressView,objective-c,nsurlconnection,uiprogressview,Objective C,Nsurlconnection,Uiprogressview,在我的“didFinishLaunchingWithOptions”方法中,我在GUI中创建了一个UIProgressView&之后,我调用一个方法来调用带有NSURLConnection的Web服务,以获取带有SOAP消息的XML 在委托方法“ConnectionDiFinishLoading”中,我使用另一个类中的NSXMLParser解析XML 问题是,我想在解析XML时更新UIProgressView,但在解析整个XML后更新它。我听说这是因为NSURLconnection在主线程上运行

在我的“didFinishLaunchingWithOptions”方法中,我在GUI中创建了一个UIProgressView&之后,我调用一个方法来调用带有NSURLConnection的Web服务,以获取带有SOAP消息的XML

在委托方法“ConnectionDiFinishLoading”中,我使用另一个类中的NSXMLParser解析XML

问题是,我想在解析XML时更新UIProgressView,但在解析整个XML后更新它。我听说这是因为NSURLconnection在主线程上运行,并且阻塞了UI

如何同时解析和更新进度条

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

NSString * theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];

NSLog( @"The XML : %@", theXML );

[theXML release];

theXmlParser = [[NSXMLParser alloc] initWithData:webData];

XMLParser * theParseur = [[XMLParser alloc] initXMLParser];

[theXmlParser setDelegate:theParseur];

[theXmlParser setShouldProcessNamespaces:NO];
[theXmlParser setShouldReportNamespacePrefixes:NO];
[theXmlParser setShouldResolveExternalEntities:NO];

NSLog(@"Begin parsing...");

BOOL success = [theXmlParser parse];

if( success ) {

    // my code...

} else {

    NSLog(@"XML partner : End Parsing > ERROR : %@", [[theXmlParser  parserError] localizedDescription] );

    [theXmlParser release];
}

[connection release];
[webData release];
}

嘿,您可以在
-(void)connection:(NSURLConnection*)connection direceivedata中更新进度条:
(NSData*)数据
{
//在此更新进度条

}

嘿,您可以在
-(void)connection:(NSURLConnection*)connection direceivedata中更新进度条:
(NSData*)数据
{
//在此更新进度条

}

NSURLConnection
在加载数据时不会阻止主线程,但在
connectiondFinishLoading:
中执行的所有操作都会阻止主线程。如果您知道文档中可能有多少个元素,那么可以使用
NSXMLParserDelegate
回调:
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*))attributeDict
以保持所见元素的运行总数,“完成百分比”将是该数字除以元素总数。在该回调中,您可以更新进度条


如果事先不知道文档的长度,就很难估计文档正在处理的长度,除非您保持处理的字节数的运行总数

NSURLConnection
在加载数据时不会阻止主线程,但在
connectiondFinishLoading:
中执行的所有操作都会阻止主线程。如果您知道文档中可能有多少个元素,那么可以使用
NSXMLParserDelegate
回调:
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*))attributeDict
以保持所见元素的运行总数,“完成百分比”将是该数字除以元素总数。在该回调中,您可以更新进度条


如果事先不知道文档的长度,就很难估计文档正在处理的长度,除非您保持处理的字节数的运行总数

谢谢你的回复!但是我不想在接收XML时更新进度条,而是在“connectionDidFinishLoading”中解析它时更新进度条。你明白吗?好的..解析。。。。为此,您必须在不同点更新progressbar。。。共享您的did接收响应的代码…-(void)连接:(NSURLConnection*)连接DIDReceiverResponse:(NSURLConness*)响应{[webData setLength:0];}(抱歉,我不知道如何包装我的代码以便更好地阅读…)抱歉。。。我的意思是ConnectionDiFinishLoading方法..对于可读的代码,请编辑您的问题,并在我的XMLParser类的“DiEndElement”委托方法中添加代码。每次我遇到一个特殊的标签,我都会说:“pgrView.progress=/*我更新的float*/”谢谢你的回复!但是我不想在接收XML时更新进度条,而是在“connectionDidFinishLoading”中解析它时更新进度条。你明白吗?好的..解析。。。。为此,您必须在不同点更新progressbar。。。共享您的did接收响应的代码…-(void)连接:(NSURLConnection*)连接DIDReceiverResponse:(NSURLConness*)响应{[webData setLength:0];}(抱歉,我不知道如何包装我的代码以便更好地阅读…)抱歉。。。我的意思是ConnectionDiFinishLoading方法..对于可读的代码,请编辑您的问题,并在我的XMLParser类的“DiEndElement”委托方法中添加代码。每次我遇到一个特殊标记时,我都会这样做:“pgrView.progress=/*我更新的float*/”