我有一个计时器,我想在给定的时间间隔内连续重复,但是我似乎可以让计时器持久化的唯一方法是将其添加到 RunLoop.main 中,如下所示:
let timer = Timer(timeInterval: timeInterval, repeats: true) { (timer) in
blockToFire()
}
RunLoop.main.add(timer, forMode: .commonModes)
Run Code Online (Sandbox Code Playgroud)
我知道使用 .commonModes 应该可以防止计时器在用户与 UI 交互时错过它的提示,但是计时器会导致添加到主运行循环的问题吗?UI会变慢吗?
您发布的代码没问题。运行循环与特定线程相关联。计时器通常在主线程/主运行循环上运行。因此,如果它们的代码执行时间太长,它们将在主线程中导致“打嗝”。不要调用代码需要很长时间才能从主线程运行的块/选择器/将它们附加到主运行循环,否则会导致 UI 速度变慢。
您还可以在后台线程上创建并运行计时器。我通常使用其中一种scheduledTimer()方法,它创建一个计时器并将其添加到“当前运行循环”(这意味着当前线程的运行循环)。
如果您想在不同的线程上运行计时器,您可以scheduledTimer()从后台线程调用其中一种方法。但请注意,您不应该从后台线程进行 UIKit 调用。
我看到关于后台线程/队列是否获得运行循环的冲突信息。苹果公司的这篇(相当旧的)文章说他们没有。
另一方面,这篇Apple 文章说系统根据 Thread 对象的需要创建运行循环。
| 归档时间: |
|
| 查看次数: |
2620 次 |
| 最近记录: |