如何更改NSTimer的时间间隔?
var difficulty: Double = 1.0
override func viewDidLoad() {
super.viewDidLoad()
_ = NSTimer.scheduledTimerWithTimeInterval(difficulty, target: self, selector: #selector(hideAllBtns), userInfo: nil, repeats: true)
}
我运行一个switch语句,每次从hideallbuttons调用,然后更新难度。
func getDifficulty (score : Double) -> Double {
switch score {
case 0...100: return(1.0)
case 100...200: return (0.8)
case 200...300: return (0.5)
case 300...400: return (0.2)
default: return (1.0)
}
}
然而NSTimer继续以1.0s开火我假设它在第一次运行时创建了一个副本并坚持该值,我试图在计时器调用中创建一个变量,但这不起作用。
是否有一种简单的方法可以动态调整定时器触发的速率?
这只是一个练习项目,因为我还在学习,所以我理解可能有更好的方法来构建我想要做的事情。我认为动态调整计时器对将来的使用非常有用。
答案 0 :(得分:4)
你不能,一旦你开火计时器,它就会运行。
我不确定你到底需要什么,但你有两个选择:
使计时器失效,并以新的时间间隔触发一个新的计时器,您甚至可以在类中声明计时器,只需覆盖该值(在您失效后)。
将重复值设置为false并每次触发新计时器。
看一下这个例子:
class ViewController: UIViewController {
var difficulty: Double = 1.0
var timer = NSTimer()
override func viewDidLoad() {
activateTimer()
}
func activateTimer(){
timer = NSTimer.scheduledTimerWithTimeInterval(difficulty, target: self, selector: Selector(self.timerMethod()), userInfo: nil, repeats: true)
}
func timerMethod() {
print("Timer method called")
}
func endTimer() {
timer.invalidate()
}
func increaseDifficulty() {
difficulty = 2.0
endTimer()
activateTimer()
}
}
答案 1 :(得分:0)
创建NSTimer对象后,无法更改NSTimer对象的间隔。
要解决此问题,您可以提高计时器触发的速率,并手动检查是否已经过了所需的时间。这允许您定义动态更新的时间量 - 模仿动态计时器:
var lastTriggered: NSDate!
var dynamicInterval = 1.0
var timerInterval = 0.1
override func viewDidLoad() {
super.viewDidLoad()
lastTriggered = NSDate()
_ = NSTimer.scheduledTimerWithTimeInterval(timerInterval, target: self, selector: #selector(hideAllBtns), userInfo: nil, repeats: true)
}
func hideAllBtns() {
let currentDate = NSDate()
if(currentDate.timeIntervalSinceDate(lastTriggered) >= dynamicInterval) {
// This will only be called every dynamicInterval seconds
// Now call getDifficulty and/or update your dynamicInterval
lastTriggered = currentDate
}
}