NSTimer选择器问题

发布于 2024-12-05 20:32:52 字数 748 浏览 2 评论 0原文

问候!

例如,我有以下函数:

-(void) doMainBrick
{
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                       target:self
                                                     selector:@selector(dropBrick:)
                                                     userInfo:nil
                                                    repeats:YES];
}

-(void) dropBrick:(NSTimer*) timex 
{
    //deal something 
   [self SwitchBrick];
}

我想知道是否可能,如果 dropBrick 函数执行的操作超过 scheduledTimerWithTimeInterval (在上面的示例中,它是 0.1), 另一个调用 dropBrick 再次发生(每 0.1 秒触发 dropBrick,重复:YES)? 或者无论如何,NSTimer 都会等待最后一个 dropBrick 结束然后触发?

Greeting !!

I've the following function for example :

-(void) doMainBrick
{
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                       target:self
                                                     selector:@selector(dropBrick:)
                                                     userInfo:nil
                                                    repeats:YES];
}

-(void) dropBrick:(NSTimer*) timex 
{
    //deal something 
   [self SwitchBrick];
}

I wonder if it is possible, if dropBrick function do more than scheduledTimerWithTimeInterval ( in my sample above , it is 0.1) ,
another call dropBrick happen again (every 0.1 sec fire dropBrick,repeats:YES)?
or no matter what, NSTimer will wait for last dropBrick end and then fired?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽心 2024-12-12 20:32:52

NSTimers 在 RunLoop 上调度。

这意味着在 RunLoop 的每次迭代中,系统都会执行以下操作:

  • 检查是否有一些已安排的计时器的触发时间已过。如果是这样,则触发关联的方法。
  • 检查其他一些输入源(例如在 RunLoop 上调度的套接字等)是否有要继续的输入数据,如果有,则处理它们。
  • 检查是否有待处理的事件,例如触摸事件,并处理它们(触发关联的操作)
  • 执行绘制
  • 再次迭代

因此:

  • NSTimer 不关心您是否手动调用 dropBrick 除了计时器本身触发的调用
  • 如果计时器调用的方法花费的时间超过指定的 timeInterval,则在 RunLoop 迭代结束时,该方法将立即再次触发,因为下一次调用的触发日期已经过去。

NSTimers are scheduled on the RunLoop.

This means that at each iteration of the RunLoop, the system does the following:

  • Checks if there are some timers scheduled for which their fire time has elapsed. If so, fire the associated method.
  • Check if some other input sources (like sockets being scheduled on the RunLoop etc) have input data to proceed, if so process them.
  • Check if there are events pending, like touch events, and handle them (fire associated actions)
  • Perform drawing
  • Iterate again

As a consequence:

  • The NSTimer doesn't care if you call dropBrick by yourself manually in addition to the calls fired by the timer itself
  • If the method called by the timer takes more than the specified timeInterval, at the end of the iteration of the RunLoop the method will be fired again immediately, because the fire date of the next call has already elapsed.
日记撕了你也走了 2024-12-12 20:32:52

我能想到的一个想法是...

设置 Repeat:NO 并让 dropBrick 递归调用自身。添加一些sleep来控制递归调用的频率。

One idea i can think of is...

Set the Repeat:NO and let dropBrick recursive call itself. Add some sleep to control the frequency of recursive call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文