有没有办法让方法在继续执行代码之前等待方法中启动的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");
答案 0 :(得分: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循环,因此循环永远不会结束。如果您有其他问题,请告诉我,块可能很奇怪。