0

我正在下载 XML 以填充用于构建 UITableView 的数组。除非另有通知,否则我相信我必须先完全下载数组,然后才能在表格中显示它(它也只是文本且非常小,因此它会在合理的时间内以最慢的连接速度下载)。最慢的时候确实需要大约 3-5 秒,所以在下载时在状态栏中显示活动指示器会很好。

我打电话给...

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

...在我做任何事情之前(然后在我做完所有事情后将其关闭),但它只是在大约最小的毫秒内弹出并退出,使其对人眼可见。

关于我为什么会有这种经历的任何建议?

谢谢,Z@K!

4

2 回答 2

1

同步下载在调用线程上执行并阻塞线程直到完成,这可能在与您的 UI 相同的线程上完成。由于下载会阻塞线程直到完成,您要么不会看到活动指示器,要么会显示并且在下载完成之前不会移动。

您必须将同步下载放在单独的线程上或使用 NSURLConnection:initWithRequest (它是多线程的)才能让应用程序按预期响应。

于 2010-07-08T01:49:43.723 回答
1

对我来说,简单的答案是 GCD,Grand Central Dispatch。我几乎不需要修改我的代码......

我的代码是这样开始的......

self.table_array = [self.webQuery downloadAndParseXMLForTable];
[(UITableView *)self.view reloadData];

*webQuery 是一个自定义对象,用于从 Web 下载和解析 xml 数据。**downloadAndParseXMLForTable 是一种自定义方法,同步下载并解析一个 XML 文件,然后返回一个 (NSArray *) 对象以支持表格视图。

下面修改后的代码显示了我为采用 GCD 必须做的唯一更改,并保持我的 UI 响应。

dispatch_queue_t table_download_queue = dispatch_queue_create("com.yourcompany.queuename", NULL);

dispatch_async(table_download_queue, ^{
    self.table_array = [self.webQuery downloadAndParseXMLForTable];
    dispatch_async(dispatch_get_main_queue(), ^{
        [(UITableView *)self.view reloadData];
    });
});

dispatch_release(table_download_queue);

就是这样!我希望这可以帮助其他人在我的困境中......

干杯,Z@K!

警告:在 WWDC 2010 上,有人提到 GCD 目前无法支持 SECURE 传输。我不记得细节了,但演讲者奎因对此非常坚决。我相信他建议的过程需要 NSOperation ......

于 2010-07-08T14:28:46.460 回答