2016-08-02 2 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,0 сек, я предполагаю, что это создает копию по первому ходу и прилипает к этому значению, я попытался создать переменную в вызове таймера, но это не работает.

Есть ли простой способ динамического изменения скорости, с которой срабатывает таймер?

Это всего лишь практический проект, так как я все еще участвую, поэтому я понимаю, что, вероятно, гораздо лучший способ структурировать то, что я пытаюсь сделать. Я думаю, что динамически настраиваемый таймер будет полезен для будущего использования.

+0

Ваш 'NSTimer' настроен на повторение: true. Таким образом, он просто повторит 1 секунду. Вам нужно установить продолжительность на основе сложности и повторить: false. Вы должны вызвать метод, чтобы запустить таймер, а в справке 'hideAllBtns' (т.е. запустить) таймер снова на основе сложности. Также проверьте, как создавать геттеры и сеттеры в быстром 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 
    } 
}