当前位置: 首页 > 面试题库 >

使用Swift将实时秒表计时器格式化为百分之一

钮勇
2023-03-14
问题内容

我有一个使用NSTimer的应用程序,该应用程序在百秒(0.01秒)的更新间隔下以String格式显示正在运行的秒表,格式为00:00.00(mm:ss.SS)。(基本上克隆iOS内置秒表以集成到实时体育计时数学问题中,将来可能需要毫秒级精度)

我使用(滥用?)NSTimer强制更新UILabel。如果用户按下开始,这是用于开始重复该功能的NSTimer代码:

displayOnlyTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("display"), userInfo: nil, repeats: true)

这是上面的NSTimer执行的函数:

func display() {
    let currentTime = CACurrentMediaTime() - timerStarted + elapsedTime

    if currentTime < 60 {
        timeDisplay.text = String(format: "%.2f", currentTime)
    }else if currentTime < 3600 {
        var minutes = String(format: "%00d", Int(currentTime/60))
        var seconds = String(format: "%05.2f", currentTime % 60)
        timeDisplay.text =  minutes + ":" + seconds
    }else {
        var hours = String(format: "%00d", Int(currentTime/3600))
        var minutes = String(format: "%02d", (Int(currentTime/60)-(Int(currentTime/3600)*60)))
        var seconds = String(format: "%05.2f", currentTime % 60)
        timeDisplay.text =  hours + ":" + minutes + ":" + seconds
    }
}

至少有2个显示链接同时运行。一旦所有其他要素都发挥作用,此方法是否会太低效?

然后,当用户按下停止/暂停/重置时,无需使用NSTimer即可更新显示。我没有发现任何直接翻译成Swift的东西。我相当确定我正在使用一种效率低下的方法来强制在UIView中快速更新文本UILabel。

更多详细信息:我正在为运行的计时器格式(mm:ss.SS)编写较少混乱的代码。完成后,我将再次更新。

更新:感谢Rob和jtbandes回答了我两个问题(格式化方法和显示更新方法)。用CADisplayLink()替换NSTimer(参见上文)很容易:

displayLink = CADisplayLink(target: self, selector: Selector("display"))
        displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)

然后替换代码中的所有实例

displayOnlyTimer.invalidate()

displayLink.paused = true

(这将暂停显示链接的更新)


问题答案:

为了快速更新UI,您应该使用CADisplayLink。任何比显示刷新速率快的操作都将浪费处理能力,因为它实际上无法显示。它还提供了timestamp上一帧的图像,因此您可以尝试预测下一帧的时间。

您正在计算CACurrentMediaTime() - timerStarted + elapsedTime多次。我建议只做一次并将其保存在本地变量中。

考虑使用NSDateComponentsFormatter。尝试重用格式化程序的一个实例,而不是每次都创建一个新的(通常是最昂贵的部分)。总体而言,您可以执行的字符串操作越少越好。

您可以在显示方法的开始和结束处检查CACurrentMediaTime,以了解需要花费多长时间。理想情况下,应
比少16.6ms。注意Xcode调试导航器中的CPU使用率(和一般功耗)。



 类似资料:
  • 问题内容: 这是我的查询: 这给了我: 表示116小时12分10秒。 相反,我想说的是4天20小时12分钟等 问题答案: 在我的示例中,将end_time和start_time用于固定的datetime值 根据以下两条评论,此解决方案仅适用于35天内的日期差异。如果您知道开始到结束之间有35天以上的时间,即一个月内有差异,请不要使用它。在这里使用TIMESTAMPDIFF的其他答案将起作用。

  • 我从总毫秒开始,我已经将其转换为总分钟和总秒: 现在我想以MM:SS格式显示分钟和秒(如果偶尔有小时,则转换为HH:MM:SS格式)。我该怎么做呢?

  • 问题内容: 这是我的代码: 是否可以在日期格式中添加毫秒和纳秒? 问题答案: 您可以通过在末尾添加来添加毫秒数,例如格式为。 毫微秒内没有参考。通常用于性能调试,而不用于显示目的。

  • 问题内容: 关于 Swift中的 时间转换,我有一个(有点?)基本问题。 我有一个整数,希望将其转换为小时/分钟/秒。 示例: 会给我: 我知道如何在PHP中执行此操作,但是可惜,Swift不是PHP :-) 我如何迅速实现这一目标的任何技巧都太棒了!先感谢您! 问题答案: 定义 用 要么 上面的函数利用Swift元组一次返回三个值。您可以使用语法对元组进行解构,或者可以根据需要访问单个元组成员。

  • 问题内容: 由于某种原因,我将时间格式转换为:。我想将其转换回原来的第一个(相同)格式。怎么可能 我的尝试: 现在,分钟呢? 考虑价值可能就像 我认为您了解了一样。 顺便说一下,如何转换 问题答案: 如果要获取时间格式:

  • 本文向大家介绍JS倒计时实例_天时分秒,包括了JS倒计时实例_天时分秒的使用技巧和注意事项,需要的朋友参考一下 HTML代码: JavaScript代码: 以上这篇JS倒计时实例_天时分秒就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。