我有一个应用程序使用 NSTimer 以厘秒(0.01 秒)的更新间隔将正在运行的秒表以字符串格式显示为 00:00.00 (mm:ss.SS)。(基本克隆了iOS内置秒表集成到实时运动计时数学题中,未来可能需要毫秒精度)
我使用(滥用?)NSTimer 来强制更新 UILabel。如果用户按下 Start,这是用于开始重复该功能的 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
(这将暂停显示链接的更新)