在执行SYNCHRONOUS下载时显示UIActivityIndi​​cator

时间:2010-07-08 01:41:45

标签: iphone network-programming multithreading uiactivityindicatorview uitableview

我正在下载XML以填充用于构建UITableView的数组。除非我得到通知,否则我相信我必须完全下载数组才能在表格中显示它(也是它的文本而且非常小,所以它会在最慢的连接下在合理的时间内下载)。它最慢需要3-5秒,因此在下载时在状态栏中显示活动指示器会很不错。

我打电话给......

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

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

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

谢谢, ž@ķ!

2 个答案:

答案 0 :(得分:1)

同步下载在调用线程上执行并阻塞线程直到完成,这可能在与UI相同的线程上完成。由于下载正在阻止线程直到完成,否则您将看不到活动指示符,或者它将显示,并且在下载完成之前不会移动。

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

答案 1 :(得分: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);

就是这样!我希望这能帮助处于困境中的其他人......

干杯, ž@ķ!

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