NSURLConnection & UIProgressView
В моем методе didFinishLaunchingWithOptions я создал UIProgressView в своем графическом интерфейсе, и после этого я вызываю метод для вызова WebService с NSURLConnection для получения XML с сообщением SOAP.
В методе делегата "connectionDidFinishLoading" я анализирую XML с NSXMLParser в другом классе.
Проблема в том, что я хочу обновить мой UIProgressView во время синтаксического анализа XML, но он обновляется после того, как весь XML был проанализирован. Я слышал, что это потому, что NSURLconnection запускается в основном потоке и блокирует пользовательский интерфейс.
Как я могу проанализировать и обновить индикатор выполнения одновременно?
- (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 ответа
Эй, вы можете обновить индикатор выполнения в -(void)connection:(NSURLConnection *)connection didReceiveData:
(NSData *)data
{
//update progress bar here
}
NSURLConnection
не блокирует основной поток при загрузке данных, но все, что вы сделали в connectionDidFinishLoading:
будут. Если вы знаете, сколько элементов может быть в документе, вы можете использовать NSXMLParserDelegate
Перезвоните: - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
для сохранения промежуточного количества видимых элементов, и "процент выполнения" будет представлять собой это число, деленное на общее количество элементов. В этом обратном вызове вы можете обновить свой индикатор выполнения.
Не зная априори длины документа, будет трудно оценить, насколько далеко он находится в процессе обработки, если только вы не будете хранить промежуточную сумму количества обработанных байтов.