2016-08-02 14 views
0

Wie kann ich das Zeitintervall auf einem NSTimer ändern?Swift NSTimer dynamisch wechselndes Intervall

var difficulty: Double = 1.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    _ = NSTimer.scheduledTimerWithTimeInterval(difficulty, target: self, selector: #selector(hideAllBtns), userInfo: nil, repeats: true) 

} 

Ich betreibe eine switch-Anweisung, die jedes Mal von hideallbuttons aufgerufen wird und dass aktualisiert dann die Schwierigkeit.

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) 

    } 
} 

jedoch NSTimer bei 1,0s Feuer weiterhin Ich nehme es eine Kopie beim ersten Durchlauf erzeugt und hält sich an diesem Wert, habe ich versucht, eine Variable in der Timer-Aufruf zu schaffen, aber das funktioniert nicht.

Gibt es eine einfache Möglichkeit, die Rate dynamisch einzustellen, mit der der Timer ausgelöst wird?

Dies ist nur ein Übungsprojekt, da ich noch lerne, also verstehe ich, dass es wahrscheinlich einen viel besseren Weg gibt zu strukturieren, was ich versuche zu tun. Ich denke, dass ein dynamisch einstellbarer Timer für die zukünftige Verwendung nützlich wäre.

+0

Ihr 'NSTimer' ist auf Wiederholung gesetzt: true. Also wird es nur 1 Sekunde wiederholen. Sie müssen die Dauer basierend auf dem Schwierigkeitsgrad festlegen und wiederholen: false. Sie sollten eine Methode aufrufen, um den Timer zu starten und den Timer im 'hideAllBtns'-Reset (z. B. Start) basierend auf dem Schwierigkeitsgrad neu starten. In https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259 erfahren Sie, wie Sie Getter und Setter erstellen – Asdrubal

+0

"Dies ist nur ein Übungsprojekt" Gute Gelegenheit, das Suchen zu üben, bevor man fragt. – matt

Antwort

2

Sie können nicht, sobald Sie den Timer auslösen, läuft es.

Ich bin nicht sicher, was genau Sie brauchen, aber Sie haben zwei Möglichkeiten:

  1. den Timer Invalidate und feuern einen neuen mit neuem Zeitintervall, können Sie sogar den Timer in der Klasse deklarieren, und Überschreibe einfach den Wert (nachdem du ungültig gemacht hast).

  2. Den Wiederholungswert auf "false" setzen und jedes Mal einen neuen Timer auslösen.

einen Blick auf dieses Beispiel nehmen:

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

Sie können das Intervall auf einem NSTimer Objekt ändern, wenn es erstellt wird.

Um dies zu umgehen, können Sie die Geschwindigkeit, mit der Ihr Timer ausgelöst wird, erhöhen und manuell prüfen, ob die gewünschte Zeit verstrichen ist. Damit können Sie eine dynamische Aktualisierungszeit definieren, die einen dynamischen Zeitgeber imitiert: