【问题标题】:Does [NSXMLParser initwithcontentsofurl:...] lock while loading?[NSXMLParser initwithcontentsofurl:...] 加载时是否锁定?
【发布时间】:2012-06-09 13:07:00
【问题描述】:

我正在从 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];   

【问题讨论】:

    标签: objective-c nsxmlparser


    【解决方案1】:

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

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

    更糟糕的是;使用 initWithContentsOfURL: 时,没有超时, 网络故障没有有意义的反馈,也没有办法 用户取消当前的网络操作。最后一个因素 完全不使用 initWithContentsOfURL: 来证明自己是正当的;你必须 永远不要发布导致糟糕用户体验的代码。您的用户将 讨厌这个,会抱怨!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不,对进度百分比不感兴趣。只需要知道它何时完成,问题基本上归结为 initWithContentsOfUrl 是否与同步或异步 NSURLConnection 一起使用。这意味着如果它确实是同步的,我可以(可能)安全地假设下载是在 initWithContentsOfURL 返回之后完成的。
      • 即使您可以假设它已经完成,您的 GUI 更新 - [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES] - 也不会可见,因为同步方法会阻止 GUI 重绘。在您返回事件循环之前,GUI 不会重绘。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 1970-01-01
        • 2015-01-07
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 2012-12-03
        相关资源
        最近更新 更多