在iOS中从服务获取数据时,如何为指标设置动画?

时间:2013-04-17 05:50:38

标签: ios json uiactivityindicatorview

我的要求是当数据从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];
}

2 个答案:

答案 0 :(得分: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:视图控制器。

答案 1 :(得分:1)

基本上,您希望在两个班级之间分享对ActivityIndicator的来电。

此功能已有很好的项目。你应该尝试它们,而不是重新发明它。它们很好并且可以在许多应用程序中使用(AppStore认可的应用程序)。

MBProgressHUD& SVProgressHUD很好。

SVProgressHUD的示例:

  1. 添加SVProgressHUD.h&您项目中的SVProgressHUD.m
  2. 然后,当您想要显示它时,请致电[SVProgressHUD showWithStatus:@"Updating..." maskType:2];(在您的情况下,您将其展示在正确的位置)
  3. 要取消它,请使用[SVProgressHUD dismiss];(在您的情况下,可能是下一个视图控制器的viewDidAppear
  4. 你已经完成了。