2011-05-10 155 views

回答

2

documents

定时器与运行 环路一起工作。要有效地使用计时器,您应该知道 运行循环的运行方式 - 请参阅NSRunLoop和Threading 编程指南。

一旦计划在运行循环中, 定时器在指定的时间间隔触发 ,直到它失效。 A 非重复定时器在其触发后立即使其自身失效 。但是,对于重复计时器,您必须 通过调用其invalidate方法使自己的计时器对象 无效。 调用此方法请求从当前的 运行循环中删除定时器 ;因此,您应该始终调用 中的无效方法,该方法与安装了计时器的相同线程 一致。无效的定时器 立即禁用它,以便它没有 更长的时间影响运行循环。然后循环运行 删除并释放 计时器,或者在 无效方法返回之前,或者在稍后的某个点处,在某些 点。一旦无效,定时器 对象不能重复使用。

我相信NSTimer不会阻塞UI线程。也看看这个以前的问题NSTimer and updating UI

8

这取决于。大多数时候,这不会是一个问题。

如果,但是,两者的满足下列标准时,一个NSTimer块UI线程:

  1. 定时器定于主线程的NSRunLoop。无论何时通过在主线程中调用NStimer的scheduledTimerWith...类方法创建它,都将是这种情况。
  2. 该方法在计时器触发时调用,执行“冗长”任务。想到同步执行的提取/ url请求会想到...
+0

为什么'scheduledTimerWith ...'方法会导致问题?我的计时器正在运行时遇到UI阻塞。我用这种方法创建了它,我没有意识到这会是一个问题。我的其他选择是什么?谢谢。 – user700774 2011-07-13 21:55:01

+1

@ user700774这些方法不是问题。问题是timer-callback中_synchronously_发生的工作量:只要回调函数返回**,定时器触发的runloop将被阻塞。如果您的回调快速退出,则在主线程上安排定时器时,您将永远不会注意到这一点。但是,如果你在那里做了一些耗时的处理(只是使用'sleep(5);'来模拟一个极端情况)......如果是这样的话,只要做到这一点_asynchronously_ - 'NSOperationQueue'和GCD是你的朋友, 这里。 – danyowdee 2011-07-15 13:18:29