如何在目标C,Spritekit中暂停for循环

时间:2015-01-09 15:29:39

标签: objective-c for-loop sprite-kit fast-enumeration

我只是想知道,如果有任何方式暂停for循环。

例如,

for (i = 0; i<10 ; i++) {

NSLog(i);
//Pause should go here
}

结果应该是: 1 (等待1秒) 2 (等待1秒) 等

首先,我认为您可以添加SKAction *wait = [SKAction waitForDuration:1 completion:^{ ,但是我不确定你是否可以从完成括号内恢复循环。

我环顾四周找到了NSTimer,但我不知道你怎么能实现这个,因为我必须在每个间隔之后调用循环,它i永远不会超过0

有没有什么方法可以暂停循环一段时间,然后让它恢复枚举?

1 个答案:

答案 0 :(得分:2)

作为一种风格问题,您通常会将循环重新格式化为尾递归。所以,而不是:

for(i = 0; i < 10; i++) {
    // ... work here ...
}

你改编为:

void doWorkForIteration(int i, int limit) {
    if(i == limit) return;

    // ... work here ...

    doWorkForIteration(i+1, limit);
}

... 
doWorkForIteration(0, 10);

它是recurses因为它自称。它是尾递归的,因为它的递归调用是它最后的事情。

完成后,您可以从直接递归调用切换到延迟调用。例如。与GCD:

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^{
    doWorkForIteration(i+1, limit);
});

...或使用[self performSelector: withObject: afterDelay:]或任何其他延期通话方式。

要按字面意思做你想要的,你可以使用C&#39 {s} sleep来电。但该线程将阻止指定的秒数。因此,除非您希望应用程序锁定,否则不要在主线程上执行此操作。