【问题标题】:How to pause a for loop in objective C, Spritekit如何在目标C,Spritekit中暂停for循环
【发布时间】:2015-01-09 15:29:38
【问题描述】:

我只是想知道,是否有任何方法可以暂停 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。

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

【问题讨论】:

  • 您的循环是否在单独的线程中?

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


【解决方案1】:

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

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);

它递归是因为它调用了自己。它是尾递归的,因为它的递归调用是它做的最后一件事。

完成此操作后,您可以从直接递归调用切换到延迟调用。例如。使用 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 的 sleep 调用。但是该线程将阻塞指定的秒数。所以不要在主线程上做,除非你想让你的应用程序锁定。

【讨论】:

  • 请注意,不建议将 GCD、NSTimer、performSelector 与 Sprite Kit 一起使用。最好使用 SKAction 实现此类行为,因为这是确保此类任务在应用暂停或进入后台时正确暂停和恢复的唯一方法。
  • 结合使用SKActions 是更好的选择。
  • @LearnCocos2D 我必须承认对SKAction一无所知;我已将答案标记为社区 wiki — 我认为您无法更正?
  • @0x141E 向您发送相同的邀请;我们只是不幸地同步发布了。
猜你喜欢
  • 2020-04-15
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多