我有三个视图控制器(A,B,C),当用户点击Tab Bar项时会显示。当用户单击第三个Tab Bar项时,将显示C View Controller。问题是,当选择第三个选项卡栏时,它会触发一个执行大量计算并创建UI元素的函数,并且我希望在完成这些任务时显示活动指示器。
现在我的情况是耗时的功能会阻塞主线程,因此当用户单击第三个Tab Bar项时,UI会冻结,并且当耗时的功能完成其工作时会显示C View Controller。但是我希望在执行函数时使用微调器显示C View Controller的背景。所以我试着把耗时的功能转移到一个新的线程,但我无法让它工作。
在- (void)viewDidLoad
中的CViewController.m中,我有:
activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityView.frame = CGRectMake(0, 0, 35, 35);
activityView.center = self.view.center;
[self.view addSubview:activityView];
[activityView startAnimating];
[NSThread detachNewThreadSelector:@selector(thirdTabClicked) toTarget:self withObject:nil];
然后是函数- (void)thirdTabClicked
:
//Bunch of code here...
[activityView performSelectorOnMainThread:@selector(calculationDone) withObject:nil waitUntilDone:NO];
- (void)calculateDone看起来像这样:
-(void) calculationDone {
[activityView stopAnimating];
[activityView removeFromSuperview];
}
但它不起作用。也许它与我有一个UITabBarControllerDelegate的自定义类这一事实有关,所以thirdTabClicked
实际上是从那里调用的。所以我的TabBarControllerDelegate.m看起来像这样:
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if ([viewController respondsToSelector:@selector(secondTabBarClicked)]) {
[(id)viewController secondTabBarClicked];
}
if ([viewController respondsToSelector:@selector(thirdTabClicked)]) {
[(id)viewController thirdTabClicked];
}
}
答案 0 :(得分:0)
你可以试试这个
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
//Fire api
dispatch_async(dispatch_get_main_queue(), ^{
// update UI
});
});
答案 1 :(得分:0)
我想知道你为什么要自定义UITabBarControllerDelegate并直接调用方法thirdTabClicked?该方法已在viewDidLoad中调用,因此我认为没有必要从TabbarController委托中调用它。