【发布时间】:2014-06-01 23:26:01
【问题描述】:
我不确定这是错误还是我做错了什么,但是当我尝试运行持续时间为 0.0 的自定义操作时,该块会运行两次。例如,如果我将此代码放在场景的 init 方法中,我会得到以下输出:
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
[self runAction:doThis];
2014-03-13 01:41:11.271 Leapfrog[2168:60b] DO THIS
2014-03-13 01:41:11.287 Leapfrog[2168:60b] DO THIS
如果我尝试依次运行两个动作,第一次执行两次,第二次执行一次,如下所示:
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];
2014-03-13 01:46:11.910 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.926 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.942 Leapfrog[2184:60b] DO THAT
到目前为止,我想出如何让它正常运行的唯一方法是在开头包含一个虚拟动作:
SKAction *wait = [SKAction waitForDuration:0.0];
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:wait, doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];
2014-03-13 01:48:41.946 Leapfrog[2192:60b] DO THIS
2014-03-13 01:48:41.964 Leapfrog[2192:60b] DO THAT
每次我想做这种事情时,我是否都陷入了持续时间为零的等待动作?
【问题讨论】:
-
听起来像一个错误。 Have you filed it with Apple? 但是,如果您正在寻找立即运行一次块的操作,为什么不直接使用
runBlock:操作? -
我只是写了这个例子来说明问题。如果我做一些更复杂的事情,runBlock: 操作将不起作用,比如我想在多个节点之间重用一个操作并且需要对每个节点的引用作为输入变量。无论如何,我猜会绕过提交错误报告。
-
我遇到了类似的问题,我的块被调用了 100 次,经过时间为 0,然后突然它被调用,经过时间为 4 秒并开始正常工作。跨度>
-
我将此作为错误报告提交,Apple 声称已修复它,也许有什么不同?
标签: ios sprite-kit