加载时[NSXMLParser initwithcontentsofurl:...]会锁定吗?

时间:2012-06-09 13:07:01

标签: objective-c nsxmlparser

我正在从URL加载一个相当简单的XML文件。我想在解析器加载文件时显示网络活动指示符,但显然不是在解析时。

问题:initWithContentsOfUrl:方法是否在从url加载文档时锁定程序执行?换句话说,下面的代码是否正确?

我觉得这很好,但我想100%肯定。

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

3 个答案:

答案 0 :(得分:4)

这篇文章很好地解释了http://akosma.com/2010/05/28/initwithcontentsofurl-methods-considered-harmful/

  

这些方法的主要问题当然是它们   同步;这意味着执行它们的线程(通常是   UI线程)将完全阻止,直到他们返回,并且在大多数情况下   应用程序这意味着你事实上阻止整个   申请未知的时间。这意味着没有按钮   或UI小部件将对输入作出反应,不可能导航,不   触摸事件将被传递或执行,根本不会发生任何事情   直到网络操作完成。

     

更糟糕;当使用initWithContentsOfURL:时,没有超时,   网络故障没有有意义的反馈,也没办法   用户取消当前的网络操作。最后一个因素   这本身就证明不使用initWithContentsOfURL:你必须   永远不会发送导致糟糕用户体验的代码。您的用户会   怨恨这个并且会抱怨!

答案 1 :(得分:1)

如果要显示下载进度,则需要使用NSURLConnection之类的内容自行下载文件,然后将本地文件路径传递给XML解析器。

答案 2 :(得分:1)

是的,确实会阻止。因此,您的活动指示器将不会显示。