我正在从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];
答案 0 :(得分:4)
这篇文章很好地解释了http://akosma.com/2010/05/28/initwithcontentsofurl-methods-considered-harmful/:
这些方法的主要问题当然是它们 同步;这意味着执行它们的线程(通常是 UI线程)将完全阻止,直到他们返回,并且在大多数情况下 应用程序这意味着你事实上阻止整个 申请未知的时间。这意味着没有按钮 或UI小部件将对输入作出反应,不可能导航,不 触摸事件将被传递或执行,根本不会发生任何事情 直到网络操作完成。
更糟糕;当使用initWithContentsOfURL:时,没有超时, 网络故障没有有意义的反馈,也没办法 用户取消当前的网络操作。最后一个因素 这本身就证明不使用initWithContentsOfURL:你必须 永远不会发送导致糟糕用户体验的代码。您的用户会 怨恨这个并且会抱怨!
答案 1 :(得分:1)
如果要显示下载进度,则需要使用NSURLConnection
之类的内容自行下载文件,然后将本地文件路径传递给XML解析器。
答案 2 :(得分:1)
是的,确实会阻止。因此,您的活动指示器将不会显示。