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

Meg*_*anX 35 nstimer nsthread ios5

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

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

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

Dik*_*235 7

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