是否应将NSTimer添加到runloop中以执行

时间:2014-06-03 13:34:25

标签: ios nstimer nsrunloop

我没有明确地将定时器添加到runloop并且它工作得很好。有一天,当我读到一篇关于NSRunLoop的文章时,它说最好将一个NSTimer实例添加到runloop实例中来执行。我只是想知道如果我不这样做会有什么害处吗?

2 个答案:

答案 0 :(得分:8)

总是需要在运行循环上安排

NSTimer个实例才能正常运行。如果您是从主线程执行此操作,则可以使用scheduleTimerWithTimeInterval,它会自动添加到主运行循环中,而无需手动调用NSRunLoop方法addTimer需要。但是如果需要,您可以创建计时器并自行添加。 scheduleTimerWithTimeInterval是一种方便的方法,可以帮助您。


如果要从后台线程创建一个没有自己的运行循环的计时器(默认情况下,当您使用后台调度队列或操作队列时,运行该线程的线程将不具有你自己的运行循环),然后你必须手动将计时器添加到运行循环。通常,人们只会将计时器添加到主运行循环中。

或者,如果你真的想要一个计时器在后台线程上运行,而不是为该线程创建一个运行循环并将计时器添加到新的运行循环,你可以使用GCD调度计时器,这不是需要运行循环才能运行。有关Objective-C示例,请参阅https://stackoverflow.com/a/19996367/1271826。有关Swift示例,请参阅https://stackoverflow.com/a/25952724/1271826

因此,除非在后台线程中创建计时器,否则只需使用scheduledTimerWithTimeInterval,您就不必担心手动将其添加到运行循环中。

答案 1 :(得分:0)

如果使用以下方法创建计时器,则需要将计时器安排到运行循环中。如果要使用自定义runloop安排时间,这些方法很有用。

timerWithTimeInterval:invocation:repeats:
timerWithTimeInterval:target:selector:userInfo:repeats

如果您想使用当前的runloop或默认的runloop来安排计时器,那么您应该使用以下方法。这些方法将使用默认模式在当前循环中调度计时器。

scheduledTimerWithTimeInterval:invocation:repeats:
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: