1

我对objective-c有点陌生。所以,如果我的问题或代码看起来很奇怪,那就可以解释原因。我有一个每 0.033 秒触发一次的 NSTimer。

timer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(timerCallback) userInfo:nil repeats:YES];

选择器函数如下所示:

BOOL running = false;
- (void) timerCallback
{
   if (running) {
    return;
   }
   running = true;
   //Do some stuff
   running = false;
}

问题是,无论如何保持同步,都必须在这些时间间隔触发 timerCallback 函数。(跳过详细说明)

但是......事实证明,timerCallback 函数会导致 NSTimer 停止并等待它完成,然后再恢复?

我有什么选择来维持间隔?timerCallback 函数可以在单独的线程中执行吗?有比 NSTimer 更好的选择吗?也许一个单独的线程开始?

4

2 回答 2

2

我建议使用类似的东西来防止阻塞。

BOOL running = false;
- (void) timerCallback
{
   if (running) {
    return;
   }

  [(NSOperationQueue*)_myOperationQueue addOperationWithBlock:^{
     running = true;
     //do Some Stuff
     running = false 
  }];
}
于 2012-08-22T12:31:20.187 回答
0

计时器将尝试保持所需的平均触发间隔 - 因为由于 NSTimer 和 NSRunLoop 的设计,它无法提供准确的计时。如果您在计时器中的代码占用了 0.033 秒以上,我不确定计时器是否会跳过一个呼叫 - 它可能

试试这个实验 - 设置计时器,然后注释掉你所有的工作,并记录时间。它应该非常接近所需时间。也就是说,在每秒 30 次调用中,如果您完全触摸 UI,这已接近您可以预期获得的最大性能。

最小化变化量的一种策略是将您正在执行的所有代码放在一个块中,并将其分派到主队列,或者更好的是,将其分派到并发线程。这样,您将在很短的时间内从通话中返回。

如果这对您不起作用,请查看 CADisplayLink。您可以使用此功能获得非常精确的回调,因为它以非常高的优先级运行。但是,您不能在回调中做任何实质性的事情,因为您只能获得一小段时间。但是,您可以将块分派到队列以在主队列(主线程)上进行处理。

于 2012-08-22T11:44:47.953 回答