0

场景是:

有一个视图有一个按钮,可以将用户带到另一个视图。在下一个视图控制器的 viewDidLoad 中,一个巨大的 XML 文件被下载、解析并显示在屏幕上。这样,当视图导航到它时,我得到了已经显示在屏幕上的数据。

问题是:

当我单击调用视图控制器并在其中进行解析的按钮时,应用程序变得无响应。下载并解析完所有数据后,应用程序将立即移至下一个视图。现在,我想在单击该按钮时显示一个活动指示器,直到应用程序无响应为止。一旦视图导航到另一个视图,活动指示器应该停止。我尝试将活动指示器放在我想登陆的 ViewController 的 viewDidLoad 中,但无济于事。

PS:由于应用程序性质的一些限制,我无法在“viewWillAppear”中进行解析。

期待回复。

4

4 回答 4

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

    }
}
于 2012-08-21T23:02:43.187 回答
1

您希望在后台下载文件。如果为此使用 NSOperations,则可以让该操作也解析 XML 文件。

如果您愿意,这为您提供了两种显示进度的方法(比一个微调器更好)。允许 50% 用于下载,50% 用于解析。当您收到 urlConnection 委托响应时,您可以了解下载的大小,然后随着数据的进来更新进度。当你开始解析时,你可以在 parser:didEndElement 中放一些代码来询问解析器它在哪一行,如果你知道总行数,你就知道它的进度。

于 2012-08-21T22:58:57.217 回答
1

你真的应该在另一个线程上进行解析。这样主线程(也是 UI 线程)可以继续。看performSelectorInBackground

您的指示器没有显示,因为解析可能发生在之前viewDidLoad。您可以先添加指标,然后推送新的视图控制器,然后删除指标。

但实际上,这是非常糟糕的 UI 和 UX 设计,您应该使用线程。

于 2012-08-21T22:53:21.073 回答
0

你可以使用 MBProgressHUD 这里是链接。

https://github.com/jdg/MBProgressHUD

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_uiactivityindicatorview_mbprogresshud/

你必须在你的 viewcontroller viewdidload 方法中使用它。

于 2012-08-24T12:30:46.240 回答