NSURLConnection& UIProgressView

时间:2011-11-02 08:29:12

标签: objective-c nsurlconnection uiprogressview

在我的“didFinishLaunchingWithOptions”方法中,我在GUI和我的GUI中创建了一个UIProgressView。之后,我调用一个方法来调用带有NSURLConnection的WebService来获取带有SOAP消息的XML。

在委托方法“connectionDidFinishLoading”中,我在另一个类中使用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];
}

2 个答案:

答案 0 :(得分:1)

嘿,您可以在-(void)connection:(NSURLConnection *)connection didReceiveData: (NSData *)data { //update progress bar here
}

中更新进度条

答案 1 :(得分:0)

在加载数据时,

NSURLConnection不会阻止主线程,但您在connectionDidFinishLoading:中执行的所有操作都会阻止。如果您知道文档中可能包含多少元素,则可以使用NSXMLParserDelegate回调:- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict来保持已查看元素的总计,并且“完成百分比”将是该数字除以元素总数。在该回调中,您可以更新进度条。

在不知道文档长度的情况下,很难估计文档的长度,除非您保持运行的总字节数处理。