在主线程和后台线程中调度NSTimer的区别?

时间:2012-09-07 18:31:05

标签: ios5 nstimer nsthread

当我在主线程上调用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:并将时间间隔设置为5秒时,执行定时器后执行代码,并在5秒后调用定时器选择器。

但是如果我在某个后台线程中尝试相同,则scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:下面的代码将不会被执行,它将等待定时器触发然后执行。当然,为了在后台线程中运行计时器,我首先得到了一个NSRunLoop的实例并运行它。

有没有办法在后台线程中设置定时器并使其无阻塞,因此代码会立即执行后执行?

1 个答案:

答案 0 :(得分:3)

NSTimer 需要一个活动的运行循环,在主线程中初始化时,它会自动使用主运行循环。如果需要创建后台计时器,则需要将其附加到线程的运行循环中,然后调用run()使其处于活动状态。

  1. NSTimer 需要一个实时的 NSRunLoop 来执行其事件。在主线程中, NSRunLoop 始终处于活动状态,直到应用终止后才停止,但是在其他线程中,必须调用 run()来激活 NSRunLoop

  2. NSTimer 必须调用 invalidate()才能释放当前计时器,否则计时器将保留对目标当前实例的强引用,并且将保留在内存中,直到调用invalidate()或应用终止为止;

  3. NSTimer 必须在同一线程中创建和失效,很多时候,我们可能会忘记这一点。

看看这个例子,可能会有所帮助>> http://www.acttos.org/2016/08/NSTimer-and-GCD-Timer-in-iOS/  和文档:https://developer.apple.com/documentation/foundation/nstimer