【问题标题】:Swift stopwatch running slower than expected [duplicate]Swift 秒表运行速度比预期慢 [重复]
【发布时间】:2018-08-20 22:54:26
【问题描述】:

我正在尝试在我的应用程序中实现秒表,但我注意到它实际上运行得比它应该运行的要慢。代码如下:

timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(display), userInfo: nil, repeats: true)

func stringFromTimeInterval(interval: TimeInterval) -> NSString {
    let ti = Int(interval)
    let minutes = ti / 6000
    let seconds = ti / 100
    let ms = ti % 100
    return NSString(format: "%0.2d:%0.2d.%0.2d",minutes,seconds,ms)
}

@objc func display() {
    interval += 1
    lapInterval += 1
    timeLabel.text = stringFromTimeInterval(interval: TimeInterval(interval)) as String
    lapLabel.text = stringFromTimeInterval(interval: TimeInterval(lapInterval)) as String
}

希望我已经提供了足够的信息。提前致谢!

【问题讨论】:

  • 真的需要跑那么快吗?我强烈怀疑它,但如果是这样,请改用 CADisplayLink。请搜索;这已经讨论过很多次了。

标签: ios swift timer ios-simulator


【解决方案1】:

不要尝试运行每百分之一秒触发一次的计时器,然后计算它触发的次数。计时器不准确。它们的分辨率更像是 50-100 毫秒(0.05 到 0.1 秒),并且由于计时器在主线程上触发,它取决于您的代码是否频繁地为事件循环提供服务。如果您进入一个耗时的代码块并且不返回,则计时器不会触发。

另外,iOS 上的屏幕刷新频率为每 1/60 秒。比这更频繁地运行计时器是没有意义的,因为您将无法更快地显示更改。

更像是每 1/30 秒运行一次计时器,并计算每次触发时经过的时间,如下所述:

要计算经过的时间,请记录要开始计时的时间(使用Date()Date().timeIntervalSinceReferenceDate),然后每次要更新时,计算'new_date - old_date'。结果将是经过的秒数,这将是精确的并且具有Double 精度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2012-12-25
    • 2020-09-04
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多