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