UIActivityMonitor不同步

时间:2014-12-10 04:04:33

标签: uitableview uiactivityindicatorview

我已经审查了许多不同的方法来启动活动指标,但我觉得正确同步似乎有点挑战。以下代码没有任何内容,但活动监视器图标(throbber)在转换到下一个视图之前的最后一刻才显示。

当用户点击UITable中的一个元素时,它会启动获取JSON响应然后将用户带到下一个View。完美的工作。除了ActivityIndi​​cator如前所述迟到。

- (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服务。我原本以为数据的来源无关紧要,只关心数据准备好了。

提前致谢!

1 个答案:

答案 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];
    });
}