【发布时间】:2014-06-03 13:34:25
【问题描述】:
我没有明确地将计时器添加到运行循环中,它工作得很好。前几天我读到一些关于NSRunLoop 的文章,它说最好将NSTimer 实例添加到runloop 实例中执行。我只是想知道如果我不这样做会有什么坏处吗?
【问题讨论】:
我没有明确地将计时器添加到运行循环中,它工作得很好。前几天我读到一些关于NSRunLoop 的文章,它说最好将NSTimer 实例添加到runloop 实例中执行。我只是想知道如果我不这样做会有什么坏处吗?
【问题讨论】:
NSTimer 实例总是需要在运行循环上调度才能正常运行。如果您是从主线程执行此操作,则只需使用scheduleTimerWithTimeInterval,它将自动为您添加到主运行循环中,无需手动调用NSRunLoop 方法addTimer。但如果需要,您可以创建计时器并自行添加。 scheduleTimerWithTimeInterval 是一种方便的方法,可以为您做到这一点。
如果您从没有自己的运行循环的后台线程创建计时器(默认情况下,当您使用后台调度队列或操作队列时,正在运行的线程将不会有自己的运行循环),然后您必须手动将计时器添加到运行循环。通常,人们只会将计时器添加到主运行循环中。
或者,如果您真的希望计时器在后台线程上运行,而不是为该线程创建运行循环并将计时器添加到新的运行循环,您可以使用 GCD 调度计时器,它不需要运行循环运行。有关 Objective-C 示例,请参阅 https://stackoverflow.com/a/19996367/1271826。有关 Swift 示例,请参阅 https://stackoverflow.com/a/25952724/1271826。
因此,除非在后台线程中创建计时器,否则只需使用scheduledTimerWithTimeInterval,您不必担心手动将其添加到运行循环中。
【讨论】:
如果您使用以下方法创建计时器,那么您需要将计时器安排到运行循环中。当您想使用自定义运行循环安排时间时,这些方法很有用。
timerWithTimeInterval:invocation:repeats:
timerWithTimeInterval:target:selector:userInfo:repeats
如果你想用当前的 runloop 或默认的 runloop 来安排定时器,那么你应该使用下面的方法。这些方法将在当前循环中以默认模式调度计时器。
scheduledTimerWithTimeInterval:invocation:repeats:
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
【讨论】: