3

如果我用 scheduleTimerWithTimeInterval 制作了一个 NSTimer,那么根据文档,它应该被添加到当前的运行循环中。我想知道如何检查 NSTimer 在哪个运行循环上。

此外,如果一个计时器无效并创建了一个新计时器,我如何将新计时器添加到第一个计时器所在的同一运行循环中?

提前致谢。

4

2 回答 2

3

我想知道如何检查哪个运行循环NSTimer正在运行。

当您安排原始计时器时,您可以保存一个引用,[NSRunLoop currentRunLoop]以便您知道它被添加到哪个运行循环。您也可以currentRunLoop在计时器的事件处理程序中使用 when 。

但是没有简单的NSTimer方法/属性可用于查询任意运行循环NSTimer已被调度。该对象也没有NSRunLoop公开任何方法以允许应用程序开发人员查询已在该特定运行循环上安排了哪些计时器。

此外,如果一个计时器无效并创建了一个新计时器,我如何将新计时器添加到第一个计时器所在的同一运行循环中?

一般来说,如果你想在当前的一个以外的地方安排 a NSTimerNSRunLoop而不是调用scheduledTimerWithTimeInterval,你会实例化计时器,然后使用运行循环的方法timerWithTimeInterval手动将此计时器添加到特定的计时器。NSRunLoopaddTimer:mode:


所有这些都引出了一个问题,即为什么要在除主循环之外的任何运行循环上安排计时器。如果您想NSTimer从后台线程使用,您必须在该后台线程上创建自己的运行循环(这有点低效,除非您有非常令人信服的理由,否则您通常不会这样做)。

通常在使用时NSTimer,您只需将它安排在主运行循环上(例如,从主线程安排它),这样就不需要创建运行循环的所有复杂逻辑,跟踪哪个计时器被安排在哪个运行上循环,以及与在同一运行循环上手动调度新计时器相关的逻辑。主运行循环通常足以优雅地处理多个计时器。

如果您确实需要在主线程以外的线程上运行的计时器,您可能需要考虑使用 GCD 调度计时器,它可以安排在任何调度队列上,而无需任何额外的运行循环。(但是,如果您想将更多计时器安排到与某个先前计时器相同的队列中,则必须跟踪添加了调度计时器的队列。)

于 2015-05-14T18:48:40.110 回答
0

当您使用该方法时,它被放置在当前线程上。如果你想在调用方法之前获取当前线程,调用 `[NSRunLoop currentRunLoop'] 并跟踪它。或者你可以明确地将它放在一个线程上并跟踪它:

 NSTimer *timer = [NSTimer timerWithTimeInterval:0.5
                                       target:self
                                     selector:@selector(timerFired:)
                                     userInfo:nil repeats:YES];
[<Insert NSRunLoop> addTimer:forMode:] 

您可以在使前一个计时器无效并立即将新计时器添加到同一循环中后立即使用它。

于 2015-05-14T18:47:55.143 回答