2

有没有办法让方法在继续执行代码之前等待方法中启动的 SpriteKit 操作完成?这是我到目前为止所拥有的,但它只是挂在等待循环中。

    __block BOOL  wait = YES;

    SKAction* move = [SKAction moveTo:destination duration:realMoveDuration];
    SKAction* sequence  = [SKAction sequence:@[[SKAction waitForDuration:0.07],move,[SKAction waitForDuration:0.07] ]];

    [spellEffect runAction:sequence  completion:^{
        [spellEffect removeFromParent];
        wait = NO;
    }];
    DLog(@"Waiting");
    while (wait) {

    }

    DLog(@"Done waiting");
4

1 回答 1

6

我认为您对块的执行有误解,苹果有很好的文档:here。您的 while 循环将无限运行,即使该块确实停止了它,使用这种类型的系统来阻止您的主线程也可能会在审查期间让您的应用程序被击落。

您应该在该块内继续。例如,如果您想继续使用名为 continueAfterAnimationIsDone 的方法,您可以这样做

// Runs first
[spellEffect runAction:sequence  completion:^{
    [spellEffect removeFromParent];
    wait = NO;
    // Done
    // Runs third
    [self continueAfterAnimationIsDone]; // this method won't start until animations are complete.
}];
// Runs second

请注意,当您声明该块时,其中的代码将被捕获,并且动画在后台线程上开始。您的其余代码继续,因此您正在等待循环将开始。一旦动画完成,这个块就会执行,但它没有办法正确通知你的 while 循环,所以循环永远不会结束。如果您还有其他问题,请告诉我,积木可能很奇怪。

于 2014-03-09T17:22:51.123 回答