UIActivityIndi​​cator在同一方法内启动和停止

时间:2014-03-07 20:23:22

标签: ios uiactivityindicatorview

我使用UIViewController显示presentViewController:animated:completion:。在被解雇之前,它需要执行一些需要几秒钟完成的计算,所以我想使用UIActivityIndicator来显示某种反馈,这样用户就不会认为应用程序被卡住了。

我将活动指示器保存到属性中,以便在更改方法流时更容易跟踪。理想情况下,当用户点击“关闭”按钮时,执行以下操作:

- (void) saveAndClose {
    [self.activityIndicator startAnimating];
    [self performNecessaryCalculations]; // this takes a little while and returns only when finished
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

然而屏幕上实际上没有任何变化。这不是活动指标可见性或功能的问题,因为如果我运行:

- (void) saveAndClose {
    [self.activityIndicator startAnimating];
}

它动画很好。似乎视图甚至没有尝试在方法结束之前重绘任何内容。如何通过单击按钮实现所需的动画,计算和解除序列?

修改 我尝试了建议的dispatch_async方法,但它尚未按预期运行。

[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self performNecessaryCalculations];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    });
});

上面的代码正确显示了活动指示器。但是,performNecessaryCalculations方法包括调用屏幕外视图控制器的tableView reloadData。这是当有问题的控制器被解雇时变得可见的控制器。 tableView没有立即正确刷新,但只有在用户尝试与之交互(滚动)之后才会刷新,或者只在坐在那里一分钟后刷新它(在我输入所有这些时刷新自己)。

任何提示?

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self performNecessaryCalculations];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.activityIndicator stopAnimating];
        [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    });
});

答案 1 :(得分:1)

您的计算正在阻止主线程,因此永远不会绘制或动画ActivityIndi​​cator。在一个单独的线程中分离计算,并在主线程结束时发出信号。

答案 2 :(得分:1)

我在类似情况下使用了performSelector:withObject:afterDelay

- (void) saveAndClose {
  [self.activityIndicator startAnimating];
  [self performSelector:@selector(reallySaveAndClose) withObject:nil afterDelay:0.001];
}

- (void) reallySaveAndClose {
  [self performNecessaryCalculations]; // this takes a little while and returns only when finished
  [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

这样,一切都保留在主线程上,但由于微小的延迟,UI会在两者之间更新,因此指示器会显示。