当我在主线程上调用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
并将时间间隔设置为5秒时,执行定时器后执行代码,并在5秒后调用定时器选择器。
但是如果我在某个后台线程中尝试相同,则scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
下面的代码将不会被执行,它将等待定时器触发然后执行。当然,为了在后台线程中运行计时器,我首先得到了一个NSRunLoop
的实例并运行它。
有没有办法在后台线程中设置定时器并使其无阻塞,因此代码会立即执行后执行?
答案 0 :(得分:3)
NSTimer 需要一个活动的运行循环,在主线程中初始化时,它会自动使用主运行循环。如果需要创建后台计时器,则需要将其附加到线程的运行循环中,然后调用run()使其处于活动状态。
NSTimer 需要一个实时的 NSRunLoop 来执行其事件。在主线程中, NSRunLoop 始终处于活动状态,直到应用终止后才停止,但是在其他线程中,必须调用 run()来激活 NSRunLoop 。
NSTimer 必须调用 invalidate()才能释放当前计时器,否则计时器将保留对目标当前实例的强引用,并且将保留在内存中,直到调用invalidate()或应用终止为止;
NSTimer 必须在同一线程中创建和失效,很多时候,我们可能会忘记这一点。
看看这个例子,可能会有所帮助>> http://www.acttos.org/2016/08/NSTimer-and-GCD-Timer-in-iOS/ 和文档:https://developer.apple.com/documentation/foundation/nstimer