38

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

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

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

4

1 回答 1

8

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

于 2019-01-24T09:12:05.227 回答