2016-08-02 174 views
0

如何更改NSTimer的时间间隔?Swift 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

你的'NSTimer'被设置为repeat:true。所以它会重复1秒。您需要根据难度设置持续时间,然后重复:false。你应该调用一个方法来启动定时器,并在'hideAllBtns'中根据难度重新启动定时器。另请参阅如何在swift中创建getter和setter。https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259 – Asdrubal

+0

“这只是一个练习项目”在询问之前练习搜索的好机会。 – matt

回答

2

一旦你启动计时器,它就不能运行。

我不知道正是你需要的,但你有两种选择:

  1. 无效定时器,并触发一个新的一个新的时间间隔,你甚至可以声明在类的定时器,只需重写该值(无效后)。

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

这个例子看看:

class ViewController: UIViewController { 
    var difficulty: Double = 1.0 
    var timer = NSTimer() 

    override func viewDidLoad() { 
     activateTimer() 
    } 

    func activateTimer(){ 
     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() 
    } 

} 
0

一旦创建它不能更改一个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 
    } 
}