将Timer添加到主RunLoop是正确的解决方案吗?

时间:2018-10-26 00:32:20

标签: ios swift timer

我有一个想要以给定间隔连续重复运行的Timer,但是我似乎可以使Timer持久的唯一方法是将其添加到RunLoop.main中,如下所示:

let timer = Timer(timeInterval: timeInterval, repeats: true) { (timer) in
    blockToFire()
}
RunLoop.main.add(timer, forMode: .commonModes)

我知道使用.commonModes应该可以防止计时器在用户与UI交互时丢失其提示,但是计时器会导致问题被添加到主运行循环中吗? UI会变慢吗?

1 个答案:

答案 0 :(得分:1)

您发布的代码很好。运行循环与特定线程相关联。计时器通常在主线程/主运行循环上运行。这样,如果它们的代码执行时间太长,它们将在主线程中引起“打ic”。不要调用代码/代码从主线程运行很长时间的块/选择器/将它们附加到主运行循环,否则会导致UI变慢。

您还可以在后台线程上创建并运行计时器。我通常使用scheduledTimer()方法之一,该方法创建一个计时器并将其添加到“当前运行循环”(这意味着当前线程的运行循环)。

如果要在其他线程上运行计时器,则可以从后台线程调用scheduledTimer()方法之一。但是请注意,您不应从后台线程进行UIKit调用。