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 для сохранения промежуточного количества видимых элементов, и "процент выполнения" будет представлять собой это число, деленное на общее количество элементов. В этом обратном вызове вы можете обновить свой индикатор выполнения.

Не зная априори длины документа, будет трудно оценить, насколько далеко он находится в процессе обработки, если только вы не будете хранить промежуточную сумму количества обработанных байтов.

Другие вопросы по тегам