场景是:
有一个视图有一个按钮,可以将用户带到另一个视图。在下一个viewcontroller的viewDidLoad中,一个巨大的XML文件被下载,解析并显示在屏幕上。这样,当视图导航到屏幕时,我就会显示已经显示在屏幕上的数据。
问题是:
当我点击调用viewcontroller并在其中解析的按钮时,应用程序变得无法响应。一旦下载并解析了所有数据,应用程序就会移动到下一个视图。现在,我想在点击该按钮时显示一个活动指示器,直到应用程序无响应为止。一旦视图导航到另一个视图,活动指示器应该停止。我尝试将活动指示器放在我想要降落的ViewController的viewDidLoad中,但无济于事。
PS:由于应用程序的性质,我无法在“viewWillAppear”中进行解析。
期待回复。
答案 0 :(得分:3)
您应该在后台队列/线程中执行任何不涉及UI的主要工作。
使用GCD,可能看起来像这样:
// Start UIActivityIndicator
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Parse your XML
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI when you're finished
}
}
答案 1 :(得分:1)
你应该真的在另一个线程上进行解析。这样主线程(也是UI线程)可以继续。看看performSelectorInBackground
。
您的指标未显示,因为解析可能发生在viewDidLoad
之前。您可以先添加指示符,然后按下新的视图控制器,然后删除指示符。
但实际上,这是非常糟糕的UI和UX设计,你应该使用线程。
答案 2 :(得分:1)
您希望在后台下载该文件。如果您为此使用NSOperations,则可以让该操作也解析XML文件。
这为您提供了两种显示进度的方法(优于仅仅是一个微调器)。允许下载50%,解析50%。获得urlConnection委托响应后,您可以了解下载的大小,然后在数据进入时更新进度。当你开始解析时,你可以在解析器:didEndElement中放入一些代码来询问解析器它的行是什么,如果你知道行的总数,你就知道它的进展。
答案 3 :(得分:0)
你可以使用MBProgressHUD这里的链接。
https://github.com/jdg/MBProgressHUD
http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_uiactivityindicatorview_mbprogresshud/
你必须在viewcontroller viewdidload方法中使用它。