2016-08-02 189 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 
    } 
}