NSURLConnection & UIProgressView - PullRequest
       14

NSURLConnection & UIProgressView

1 голос
/ 02 ноября 2011

В моем методе "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 ]

1 голос
/ 02 ноября 2011

Эй, вы можете обновить индикатор выполнения в
-(void)connection:(NSURLConnection *)connection didReceiveData: (NSData *)data { //update progress bar here<br> }

0 голосов
/ 03 июля 2012

NSURLConnection не блокирует основной поток при загрузке данных, но все, что вы делали в connectionDidFinishLoading:, будет.Если вы знаете, сколько элементов может быть в документе, вы можете использовать обратный вызов NSXMLParserDelegate: - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict, чтобы сохранить промежуточный итог видимых элементов, и "процент выполнения" будет равен этому числу, деленному на общее количество элементов,В этом обратном вызове вы можете затем обновить свой индикатор выполнения.

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

...