Swift NSTimer动态改变间隔

时间:2016-08-02 18:31:42

标签: swift nstimer

如何更改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开火我假设它在第一次运行时创建了一个副本并坚持该值,我试图在计时器调用中创建一个变量,但这不起作用。

是否有一种简单的方法可以动态调整定时器触发的速率?

这只是一个练习项目,因为我还在学习,所以我理解可能有更好的方法来构建我想要做的事情。我认为动态调整计时器对将来的使用非常有用。

2 个答案:

答案 0 :(得分:4)

你不能,一旦你开火计时器,它就会运行。

我不确定你到底需要什么,但你有两个选择:

  1. 使计时器失效,并以新的时间间隔触发一个新的计时器,您甚至可以在类中声明计时器,只需覆盖该值(在您失效后)。

  2. 将重复值设置为false并每次触发新计时器。

  3. 看一下这个例子:

    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
    }
}