我使用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没有立即正确刷新,但只有在用户尝试与之交互(滚动)之后才会刷新,或者只在坐在那里一分钟后刷新它(在我输入所有这些时刷新自己)。
任何提示?
答案 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)
您的计算正在阻止主线程,因此永远不会绘制或动画ActivityIndicator。在一个单独的线程中分离计算,并在主线程结束时发出信号。
答案 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会在两者之间更新,因此指示器会显示。