我有一个使用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元组一次返回三个值。您可以使用语法对元组进行解构,或者可以根据需要访问单个元组成员。
问题内容: 这是我的代码: 是否可以在日期格式中添加毫秒和纳秒? 问题答案: 您可以通过在末尾添加来添加毫秒数,例如格式为。 毫微秒内没有参考。通常用于性能调试,而不用于显示目的。
问题内容: 由于某种原因,我将时间格式转换为:。我想将其转换回原来的第一个(相同)格式。怎么可能 我的尝试: 现在,分钟呢? 考虑价值可能就像 我认为您了解了一样。 顺便说一下,如何转换 问题答案: 如果要获取时间格式:
我试图创建一个基于时间的倒计时钟。它不是基于current_dates。将被拉取的初始时间将来自一个单独的php文件。这将是一个基于浏览器的游戏。当有人点击按钮来启动这个脚本。它将检查是否满足某些要求,如果满足,那么这个脚本将启动。根据对象的级别,它将拉动该进行中级别的初始计时器。希望这有意义。无论如何,我基于我提供的第一个代码的计时器脚本。 此脚本仅占分钟和秒。我对它进行了修改,使其也包括了天和