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

标签 ios swift timer

我有一个定时器,我想在给定的时间间隔内连续重复,但是我似乎可以让定时器持续存在的唯一方法是将它添加到 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/

相关文章:

java - 图形加载缓慢或什至无法加载

java - 为什么每次我再次启动计时器事件时,它的触发速度都会越来越快?

java - 如何在 Java 中启动和停止计时器

ios - "instantiateViewControllerWithIdentifier"加载时间比推送时间

ios - SWIFT - UIDatePicker - 开始和结束日期选择,但无法弄清楚如何将这两个日期调用到两个不同的文本框中

ios - 如何在 Google maps ios sdk 中过滤自动完成国家?

objective-c - 在自定义 slider 中创建更改值的操作

ios - 日期不是使用 DateFormatter 从字符串创建的

ios - 更改场景时,应用内购买会导致应用崩溃

iOS:无法在 didFinishLaunchingWithOptions 中将 UIApplicationidleTimerDisabled 设置为 YES