2012-08-10 68 views
0

實際上,我使用NSXMLParser類來解析託管在服務器上的XML文件。 雖然解析器是做他的工作,我想顯示一個進度HUD抓住有:https://github.com/jdg/MBProgressHUD在解析XML之前未顯示進度HUD

這是我如何顯示進度HUD:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:NO]; 
hud.labelText = @"Update"; 

然後我開始用我做了一個類解析器:

[dm parseXMLAtURL:[NSURL URLWithString:@"myXML.xml.php"]]; 

以下是完整的類方法:

- (void)parseXMLAtURL:(NSURL *)XMLUrl { 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:XMLUrl]; 
    [parser setDelegate:self]; 
    NSLog(@"start"); 
    [parser parse];  
} 

在解析XML之前,我明顯地調用了MBProgressHUD,但是沒有辦法:解析器完成作業時顯示MBProgressHUD

我認爲這個問題可能是由於堆棧管理,當他在別人面前做最長的工作時(解析完整的XML需要6-7次)我是對的還是可能是另一種東西?如果我是對的,我該如何管理?

回答

2

我不能肯定地從你發佈的代碼,但它可能是因爲XML解析器阻止你的主線程。

要修復它,使用dispatch_async或類似的方法將XML解析產生到另一個線程。 HUD自述文件中的用法也對此進行了解釋。

問候

+0

我會看看'dispatch_async'謝謝。 – Edelweiss 2012-08-10 12:35:39

3

你很懷疑它與時間有關。因爲全部都是在同一個線程上完成的。 僅僅通過幾毫秒的延遲XML的解析:

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:NO]; 
hud.labelText = @"Update"; 
[dm performSelector:@selector(parseXMLAtURL:) withObject:[NSURL URLWithString:@"myXML.xml.php"] afterDelay:0.1f]; 

不是像你一樣運行XML解析上一個新的線程,但它會奏效。

+0

做工不錯,我會保持它,如果我不能與克勞斯的解決方案做到這一點(使用不同的線程)謝謝您的快速答覆 – Edelweiss 2012-08-10 12:34:56

+0

這是iOS上的處理和UI更新一般建議做如果你在一個事件循環中並且兩個事件必須同時發生,那麼執行選擇器......在開始UI更新之前延遲完成事件循環(反之亦然)總是一個好主意。根據你的需要來對照答案。在這種情況下,用戶界面被封鎖,所以更完整的多線程不會給你買很多東西。 – 2012-08-10 13:28:58