我正在下载XML以填充用于构建UITableView的数组。除非我得到通知,否则我相信我必须完全下载数组才能在表格中显示它(也是它的文本而且非常小,所以它会在最慢的连接下在合理的时间内下载)。它最慢需要3-5秒,因此在下载时在状态栏中显示活动指示器会很不错。
我打电话给......
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
......在我做任何事情之前(然后在我完成所有事情后将其关闭),但它只会弹出并退出大约最小的毫秒数,使人眼可以看到它。
有关为什么我有这种经历的任何建议?
谢谢, ž@ķ!
答案 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 ......