活动指示符多线程执行

时间:2014-07-04 00:59:20

标签: ios objective-c multithreading

当我的代码点击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服务调用在两个单独的线程上运行?

2 个答案:

答案 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服务调用。

如果您需要有关如何执行此操作的详细信息,请与我们联系。