1

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

问题:从 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

3 回答 3

4

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

当然,这些方法的主要问题是它们是同步的;这意味着执行它们的线程(通常是 UI 线程)将完全阻塞,直到它们返回,并且在大多数应用程序中,这意味着您实际上阻塞了整个应用程序一段未知的时间。这意味着没有按钮或 UI 小部件会对输入做出反应,无法进行导航,不会传递或执行触摸事件,在网络操作完成之前什么都不会发生。

更糟; 使用initWithContentsOfURL:时,没有超时,网络故障没有有意义的反馈,用户也没有办法取消当前的网络操作。最后一个因素本身就证明不使用 initWithContentsOfURL: 是合理的;您绝不能发布导致糟糕用户体验的代码。您的用户会对此感到不满并抱怨!

于 2012-06-09T14:00:21.067 回答
1

是的,它确实阻塞了。因此,您的活动指示符将不会显示。

于 2012-06-09T13:53:54.837 回答
1

如果您想显示下载进度,您需要自己使用类似的东西下载文件NSURLConnection,然后将本地文件路径传递给 XML 解析器。

于 2012-06-09T13:24:28.797 回答