我已经审查了许多不同的方法来启动活动指标,但我觉得正确同步似乎有点挑战。以下代码没有任何内容,但活动监视器图标(throbber)在转换到下一个视图之前的最后一刻才显示。
当用户点击UITable中的一个元素时,它会启动获取JSON响应然后将用户带到下一个View。完美的工作。除了ActivityIndicator如前所述迟到。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.frame = CGRectMake(0, 0, 24, 24);
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = spinner;
[spinner startAnimating];
timer = [NSTimer scheduledTimerWithTimeInterval:3.0/1.0 target:self selector:@selector(loading) userInfo:nil repeats:YES];
//Go to the next view
if ([cell.textLabel.text isEqualToString:@"Vatsim Pilots"]) {
VatsimViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"newview"];
[self.navigationController pushViewController:detail animated:YES];
}
}
我试图使用NSStimer功能,但显然不起作用。我见过其他人这样做但没有点击JSON服务。我原本以为数据的来源无关紧要,只关心数据准备好了。
提前致谢!
答案 0 :(得分:1)
问题在于,在所有代码完成之后,微调器才会在当前CATransaction结束之后才开始旋转。但是你的代码在JSON响应回来之前没有完成,因为(在代码中显然没有显示)你可以同步进行这种交互。
别。你不应该同步联网!当你这样做时,你正在阻止主线程 - 如果你这么做太长时间,那么WatchDog进程会杀死你的应用程序。
因此,旋转器无法启动的事实实际上是你做错了更深层次的症状。
话虽如此,问题的解决方案是启动微调器旋转然后立即离开主线程,以便CATransaction有机会结束。然后旋转器将开始旋转! 然后当您的代码重新输入时,您可以开始耗时的导航,就像在此代码中一样(来自我的书):
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// ... start spinner here ...
// now get off main thread
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// ... now do time-consuming stuff ...
// ... and finally, navigate:
UIViewController *detailViewController = [ViewController new];
[self.navigationController pushViewController:detailViewController animated:YES];
});
}