菜鸟教程小白 发表于 2022-12-12 14:59:56

ios - 为什么计时器有时会这么快地调用它的 block


                                            <p><p>我创建一个计时器并每 5 秒调用一次它的 block 。然后我申请进入后台并在一段时间后进入前台。但它有时可以快速调用 block 。</p>

<pre><code>let _ = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { (timer) in
      print(&#34;--------&#34;)
   }
</code></pre>

<p>当我进入前台时,第一次打印和第二次打印的间隔有时可能不到一秒。这种情况下时间间隔无效吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>要了解该行为,您需要了解 <code>NSTimer</code> 和 <code>RunLoop</code> 的工作原理。简单来说,<code>RunLoop</code> 会检查 Timer 是否应该触发,如果是,它会通知 Timer 触发选择器,否则不会。现在,由于您在后台,您的 <code>RunLoop</code> 不会检查事件,因此它无法通知 Timer。但是一旦它进入前台,它会看到它需要通知 Timer,即使它超过了 fireDate。</p>

<p>时间线图:</p>

<p>设 A(第 5 秒)和 B(第 10 秒)为计时器触发事件​​。计划在计时器上 <code>Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true)</code> </p>

<p>C 进入后台(0 秒)</p>

<p>D 会回到前台(第 9 秒,在 A 和 B 之间)。</p>

<p>-----> A ------> B</p>

<p>C--------->D</p>

<p>解释:</p>

<p>在 C 上,RunLoop 将暂停。因此,在 RunLoop 恢复处理之前无法处理事件 A,这在事件 D 上。在事件 D 上,它将看到事件 A 应该触发,因此它会通知计时器。一秒钟后,RunLoop 会看到 Event B 已经发生,因此它会再次通知 Timer。这个场景解释了为什么你的事件在一秒钟的时间间隔内打印出来。只是延迟的事件处理使它看起来更早触发,而实际上它被延迟处理。</p>

<p>苹果文档:</p>

<blockquote>
<p>A timer is not a real-time mechanism. If a timer’s firing time occurs
during a long run loop callout or while the run loop is in a mode that
isn&#39;t monitoring the timer, the timer doesn&#39;t fire until the next time
the run loop checks the timer. Therefore, the actual time at which a
timer fires can be significantly later.</p>
</blockquote>

<p>资源:<a href="https://stackoverflow.com/questions/37215537/what-is-an-nstimers-behavior-when-the-app-is-backgrounded" rel="noreferrer noopener nofollow">What is an NSTimer&#39;s behavior when the app is backgrounded?</a> , NSRunLoop 和 Timer 文档</p>

<p>建议:</p>

<p>应用程序进入后台后停止计时器,但存储 <code>fireDate</code>。回到前台后,检查 <code>fireDate</code> 是否超过 <code>Date()</code>。然后创建一个新的 Timer 来在前台处理事件。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么计时器有时会这么快地调用它的 block ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/53624323/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/53624323/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么计时器有时会这么快地调用它的 block