0

我的要求是当从 JSON 中检索数据时,我需要显示活动指示器,但数据检索仅以一种方法执行。这意味着例如,当我单击按钮时,它会从 JSON 中检索数据并在表视图中显示该表视图存在于另一个视图控制器中。这里我的情况是当用户单击按钮时我需要检索数据并导航到下一个视图。当数据检索时我需要显示活动指示器。

-(void)searchBtnActn {

    [self.webViewActivityIndicator setHidden:NO];

    [self.view addSubview:webViewActivityIndicator];

    [self.view bringSubviewToFront:webViewActivityIndicator];

    [webViewActivityIndicator startAnimating];

    if ([textField.text intValue] > 0)
    {
        AppDelegate *sharedDelegate = [[UIApplication sharedApplication]delegate];
        sharedDelegate.textFldData = textField.text;

        DealerLocationMapViewController *dealerLocationObj = [[DealerLocationMapViewController alloc]initWithNibName:@"DealerLocationMapViewController" bundle:nil];

        dispatch_queue_t queue = dispatch_get_global_queue(
                                                       DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
             [dealerLocationObj searchBtnmethod:textField.text];

              [webViewActivityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
    });

        [self.navigationController pushViewController:dealerLocationObj animated:YES];
    [dealerLocationObj release];
}
4

2 回答 2

1

基本上,您想ActivityIndicator在两个班级之间共享您的电话。

这个特性已经有很好的项目了。您应该尝试它们而不是重新发明它。它们很好,可以在许多应用程序中使用(AppStore 批准的应用程序)。

MBProgressHUD&SVProgressHUD是个好人。

示例SVProgressHUD

  1. 在您的项目中添加SVProgressHUD.h& 。SVProgressHUD.m
  2. 然后当你想显示它时,打电话[SVProgressHUD showWithStatus:@"Updating..." maskType:2];(在你的情况下,你在正确的地方显示它)
  3. 要关闭它,请使用[SVProgressHUD dismiss]; (在您的情况下,可能是下一个视图控制器的viewDidAppear

你完成了。

于 2013-04-17T06:53:52.060 回答
1

我将在这里做一些假设,因为您的方法名称对我来说不是很清楚。

看着:

dispatch_async(queue, ^{
    [dealerLocationObj searchBtnmethod:textField.text];

    [webViewActivityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
});

似乎这searchBtnmethod:很可能是进行 Web 服务调用的方法,并且您希望它异步运行,这就是您将它放在一个dispatch_async块中的原因。

如果是这种情况,你有一些事情不正常。

如果它是对 Web 服务的同步调用,因为您不想阻塞主线程,那么您对这个方法使用异步块是正确的。但问题是你马上打电话

[self.navigationController pushViewController:dealerLocationObj animated:YES];

在分派块之后,这意味着您的视图在您的 Web 服务调用完成之前被推送,因此您在 Web 服务调用期间没有看到活动指示器动画的原因。

重组你的代码看起来像这样,如果我的假设是正确的......

dispatch_async(queue, ^{
    [dealerLocationObj searchBtnmethod:textField.text];

    dispatch_async(dispatch_get_main_queue(), ^{
        [webViewActivityIndicator stopAnimating];
        [self.navigationController pushViewController:dealerLocationObj animated:YES];
    });
});

这将导致在主队列上调度一个块,该队列停止活动指示器并dealerLocationObj在完成后推送视图控制器searchBtnmethod:

于 2013-04-17T06:14:36.573 回答