【问题标题】:Should a NSTimer always be added into a runloop to execute是否应该始终将 NSTimer 添加到运行循环中执行
【发布时间】:2014-06-03 13:34:25
【问题描述】:

我没有明确地将计时器添加到运行循环中,它工作得很好。前几天我读到一些关于NSRunLoop 的文章,它说最好将NSTimer 实例添加到runloop 实例中执行。我只是想知道如果我不这样做会有什么坏处吗?

【问题讨论】:

    标签: ios nstimer nsrunloop


    【解决方案1】:

    NSTimer 实例总是需要在运行循环上调度才能正常运行。如果您是从主线程执行此操作,则只需使用scheduleTimerWithTimeInterval,它将自动为您添加到主运行循环中,无需手动调用NSRunLoop 方法addTimer。但如果需要,您可以创建计时器并自行添加。 scheduleTimerWithTimeInterval 是一种方便的方法,可以为您做到这一点。


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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        相关资源
        最近更新 更多