2012-06-09 55 views
1

我正在從URL加載一個相當簡單的XML文件。我想在解析器加載文件時顯示網絡活動指示器,但顯然不是在解析時。加載時[NSXMLParser initwithcontentsofurl:...]是否鎖定?

問題:當文檔從url加載時,initWithContentsOfUrl:方法是否執行鎖定程序?換句話說,下面的代碼是正確的嗎?

這似乎很明顯,這是好的,但我想100%肯定。

NSString* const urlString = @"..."; 
NSURL* url = [NSURL URLWithString:urlString]; 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

回答

4

本文介紹了它相當不錯http://akosma.com/2010/05/28/initwithcontentsofurl-methods-considered-harmful/

這些方法的主要問題,當然是事實,他們 是同步;這意味着執行它們的線程(通常爲 UI線程)將完全阻塞,直到它們返回,並且在大多數 應用程序中,這意味着您事實上將整個 應用程序阻塞了未知的時間。這意味着沒有任何按鈕 或UI小部件會對輸入做出反應,不會導航,也不會觸發 觸摸事件將被髮送或執行,直到網絡操作完成後,根本不會發生任何事情。

更糟;當使用initWithContentsOfURL時,沒有超時, 沒有有意義的反饋對於網絡故障,並且沒有辦法讓用戶取消當前的網絡操作 。這最後一個因素 本身證明不使用initWithContentsOfURL:完全;您必須 從不運送導致不良用戶體驗的代碼。您的用戶將會對此感到不滿,並會投訴!

1

如果你想顯示下載進度,你需要下載使用類似NSURLConnection自己的文件,然後將本地文件路徑傳遞到XML解析器。

+0

不,對進度百分比不感興趣。只需要知道它何時完成,並且問題基本上歸結爲initWithContentsOfUrl與同步或異步NSURLConnection協同工作。意思是如果它確實是同步的,我可以(可能)安全地假定在initWithContentsOfURL返回之後完成下載。 – pille

+0

即使您可以認爲它已完成,您的GUI更新 - [[[UIApplication sharedApplication] setNetworkActivityIndi​​catorVisible:YES]' - 將不可見,因爲同步方法阻止GUI重繪。在返回到事件循環之前,GUI不會重新繪製。 –

1

是的,它阻止。所以你的活動indocator將不會顯示。