当我的代码点击Web服务调用时,活动指示器不显示,并且按钮在"选择"中冻结。州。我希望活动指示器在进行Web服务调用时运行,这样屏幕看起来就不会冻结。
以下是启动活动指标的代码:
[activityInd startAnimating];
以下是我拨打网络服务电话的代码:
NSString *urlString = [NSString stringWithFormat:@"http://us.api.invisiblehand.co.uk/v1/products?query=%@&app_id=dad00cb7&app_key=ab386c3e1b99b58b876f237d77b4211a", [[searchedItem.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSArray *itemCallArray = [NSArray arrayWithArray:dataDictionary[@"results"]];
如何使活动指示符和Web服务调用在两个单独的线程上运行?
答案 0 :(得分:2)
不要重写代码,只需在后台运行即可。
NSString *urlString = [NSString stringWithFormat:@"http://us.api.invisiblehand.co.uk/v1/products?query=%@&app_id=dad00cb7&app_key=ab386c3e1b99b58b876f237d77b4211a", [[searchedItem.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];
[activityInd startAnimating];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSArray *itemCallArray = [NSArray arrayWithArray:dataDictionary[@"results"]];
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
[activityInd stopAnimating];
});
});
答案 1 :(得分:0)
您是否在主线程上运行Web服务调用。你永远不应该在主线程上运行它。这将冻结GUI,操作系统将终止您的应用程序。
在主线程上运行活动指示器,并使用块在另一个线程中运行Web服务调用。
如果您需要有关如何执行此操作的详细信息,请与我们联系。