为什么我的故事板在执行之前会在一行代码之前触发?

时间:2013-01-27 22:16:56

标签: ios objective-c multithreading grand-central-dispatch uiactivityindicatorview

我正在游戏的主菜单和游戏本身之间转换,我需要一个加载屏幕。目前的行为是我点击“播放”按钮,几秒钟内没有移动也没有任何偏离,然后游戏开始。

暂时,我只是抛出UIActivityIndicatorView并手动告诉startAnimating,然后将segue调用到另一个场景。问题是游戏视图中的代码(segue的终点)是在视图在屏幕上进行物理更改之前运行的(即我正在执行游戏代码时看到菜单)。我不太明白这是怎么发生的,因为在调用segue之前告诉微调器显示。这是代码:

- (IBAction) startGame: (id) sender
{
    [_loadingView setHidden: NO];
    [_loadingSpinner startAnimating];
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}

实际花费时间的东西直到segue完成才被调用(即直到游戏的主视图在屏幕上显示完全不同的ViewController(它查询SQLite数据库)),为什么是在完成这项工作之后,旋转器才显示出来?我应该使用GCD还是类似的?我已经做了一些实验,但它可能比我目前的水平还要高。重代码包含在一个方法中,所以我最好能够做这样的事情,按字面顺序执行这些行。

[spinner startAnimating];
[self callMethodThatTakesAges];
[spinner stopAnimating];

我尝试使用performSelectorOnMainThread:withObject:waitUntilDone:,但似乎在两个视图之间感到困惑。旋转器应该在游戏视图上显示,而不是菜单视图,理想情况下,所以我应该点击Play,过渡到游戏视图应该是即时的,然后旋转器应该出现,加载应该开始,旋转器应该在完成时消失。

有什么想法吗?谢谢!

编辑:以下是我的游戏视图控制器中的一些方法(makeNewWord是一种麻烦的方法)。

- (void) viewDidAppear: (BOOL) animated
{
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
    [spinner setCenter: CGPointMake(240, 55)];
    [self.view addSubview: spinner];
    [spinner startAnimating];
    [self makeNewWord];
    [spinner stopAnimating];
    [self becomeFirstResponder];

}

- (void) viewDidLoad
{
    [super viewDidLoad];
    [self canBecomeFirstResponder];

    firstLetterMultiplierLetter = [[NSString alloc] init];
    userIsEnteringAWord = NO;

    [self setUpGestures];
}

这是从我的主菜单视图中调用的方法,该方法将进入游戏视图:

- (IBAction) startGame: (id) sender
{
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}

1 个答案:

答案 0 :(得分:0)

很难说出你的问题在哪里。我想说你想这样做:

1) add the spinner to the game view 
2) in game view viewDidAppear, have [spinner startAnimating];
3) call [self methodThatTakesAges] (as the next line in viewDidAppear).
4) call [spinner stopAnimating] from whatever call back method you have in methodThatTakesAges

你的startGame:方法中唯一应该是performSegue行。您可能还需要将开始下载的位置更改为我所说的位置,现在还不清楚您从何处开始下载。