我有一个定时器,我想在给定的时间间隔内连续重复,但是我似乎可以让定时器持续存在的唯一方法是将它添加到 RunLoop.main 中,如下所示:
let timer = Timer(timeInterval: timeInterval, repeats: true) { (timer) in
blockToFire()
}
RunLoop.main.add(timer, forMode: .commonModes)
我知道使用 .commonModes 应该可以防止定时器在用户与 UI 交互时错过它的提示,但是定时器会导致添加到主运行循环中的问题吗? UI 会变慢吗?
最佳答案
您发布的代码没问题。 runloop 与特定线程相关联。计时器通常在主线程/主运行循环上运行。因此,如果他们的代码执行时间太长,他们将在主线程中引起“打嗝”。不要调用代码需要很长时间才能从主线程运行/将它们附加到主运行循环的 block /选择器,否则会导致 UI 变慢。
您还可以在后台线程上创建和运行计时器。我通常使用 scheduledTimer()
方法之一,它创建一个计时器并将其添加到“当前运行循环”(这意味着当前线程的运行循环。)
如果您想在不同的线程上运行计时器,您可以从后台线程调用 scheduledTimer()
方法之一。但是请注意,您不应该从后台线程调用 UIKit。
关于ios - 将 Timer 添加到主 RunLoop 是正确的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52999837/