【问题标题】:Activity Indicator Multithreaded Execution活动指示器多线程执行
【发布时间】:2014-07-04 00:59:20
【问题描述】:

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

【问题讨论】:

  • 有两种方法可以做你想做的事。首先,要使用异步请求。 NSURLConnection sendAsynchronousRequest 将是答案。二、在异步队列中运行活动指示器——dispatch_async
  • 如果我的回答符合您的要求,请接受。否则,请告诉我。

标签: ios objective-c multithreading


【解决方案1】:

不要重写代码,只需在后台运行即可。

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];
    });
});

【讨论】:

    【解决方案2】:

    您是否在主线程上运行 Web 服务调用。你永远不应该在主线程上运行它。这将冻结 GUI,操作系统将终止您的应用程序。

    在主线程上运行活动指示器,并使用块在另一个线程中运行 Web 服务调用。

    如果您需要有关如何执行此操作的更多详细信息,请告诉我。

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2012-06-08
      • 2010-11-08
      • 2011-09-12
      相关资源
      最近更新 更多