【问题标题】:Timing loop results时序循环结果
【发布时间】:2010-09-26 19:32:55
【问题描述】:

我有点卡住了,我希望有人能指出我正确的方向。我有一个存储序列的 NSMutableArray。我创建了一个枚举器,以便一个while循环可以一个一个地获取数组的内容。

一切正常,但是我希望在每次调用之间有 10 秒的间隔来调用这些方法。现在它一次播放(或以非常快的顺序)。在方法调用之间产生延迟应该注意什么?

以下是我目前得到的。谢谢!

NSEnumerator * enumerator = [gameSequenceArray objectEnumerator];
id element;

while(element = [enumerator nextObject])
{
    NSLog(element);

    int elementInt = [element intValue];
    [self.view showButton:elementInt];
}

【问题讨论】:

  • 嘿,非常感谢大家的意见。我会想出一个解决方案,我会在完成后发布。再次感谢,我很感激。

标签: ios objective-c iphone cocoa-touch


【解决方案1】:

您几乎肯定不想在循环中添加“延迟”,这会阻塞线程直到它结束(并且,除非您的应用程序是多线程的,否则会阻塞整个线程)。您可以使用多个线程,但我可能会将循环拆分为另一个选择器的重复定时调用。存储枚举数(或当前索引),然后查看NSObject的performSelector:awithObject:afterDelay:

类似

[NSObject performSelector:@selector(some:selector:name:) withObject:objInstance afterDelay: 10]

选择器将在哪里拾取当前枚举器,使用它,推进它并安排另一个调用。确保在执行这组定时方法时不允许更改集合。

【讨论】:

    【解决方案2】:

    这就是 NSTimer 的用途。使用 NSTimer 顺序获取数组中的每个元素。

    【讨论】:

      【解决方案3】:

      顺便说一句:您可能想看看 Objective-C 2.0 的 Fast Enumeration

      【讨论】:

      • 除非这有点与他想要的相反。他想枚举真的很慢
      • 你不知道这是一个既定的军事传统 - 快点等等。
      【解决方案4】:

      如果gameSequenceArray是一个数组,那么你不需要使用枚举器:

      NSTimeInterval time = 10;
      
      for (id elementId in gameSequenceArray) {
      
          [self.view performSelector:@selector(showButton:) withObject:elementID afterDelay:time];
      }
      

      然后你声明 showButton:

      - (void)showButton:(id)anElement {
          ...
      }
      

      【讨论】:

        【解决方案5】:

        如果您最终使用计时器传递对象枚举器,请注意在完成枚举之前不允许修改数组的内容。

        【讨论】:

          【解决方案6】:

          所以这是我根据大家的意见提出的解决方案。

          NSEnumerator * enumerator = [gameSequenceArray objectEnumerator];
          
          NSTimeInterval time = 5;
          
          for (NSString *element in enumerator) {
              id elementId = element;
          
              time++;
          
              [self.view performSelector:@selector(showButton:) withObject:elementId afterDelay:time];
          }
          

          再次感谢大家为我指明正确的方向。

          【讨论】:

          • time++ 表示选择器将在 6、7、8、...秒后触发
          • 是的,我希望每个方法调用之间有一个短暂的延迟。
          猜你喜欢
          • 1970-01-01
          • 2022-01-25
          • 2011-07-06
          • 2014-12-05
          • 1970-01-01
          • 2020-07-17
          • 2020-06-24
          • 1970-01-01
          • 2013-06-05
          相关资源
          最近更新 更多