我正在下载XML以填充用于构建UITableView的数组。在我收到其他通知之前,我相信我必须完全下载数组,然后才能在表中显示它(而且它只是文本,而且非常小,所以它可以在最慢的连接上在合理的时间内下载)。在最慢的时候,它确实需要3-5秒的时间,所以当它下载时,在状态栏中显示活动指示器会很好。
我打电话给……
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
...before我做了任何事情(然后在我做完所有事情后将其关闭),但它只是在大约使人眼可见的最小毫秒内弹出和退出。
对于我为什么会有这样的经历,有什么建议吗?
谢谢,Z@K!
发布于 2010-07-08 22:28:46
对我来说,简单的答案是GCD,中央调度台。我几乎不用修改我的代码...
我的代码是这样开始的.
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目前不支持安全传输。我不记得细节了,但演讲者Quinn对此非常坚决。我相信他建议的过程需要NSOperation..。
发布于 2010-07-08 09:49:44
同步下载在调用线程上执行,并阻塞线程,直到它完成,这可能是在与UI相同的线程上完成的。因为下载会阻塞线程,直到它完成,你要么看不到活动指示器,要么它会显示并且在下载完成之前不会移动。
您必须将同步下载放在单独的线程上,或者使用NSURLConnection:initWithRequest (多线程)才能让App按预期响应。
https://stackoverflow.com/questions/3200156
复制相似问题