2016-08-28 9 views
0

Ich möchte den Timer innerhalb einer Schleife für eine bestimmte Anzahl von Schleifen nur ausführen. Es gibt auch eine äußere Schleife.Timer in der for-Schleife in Swift

Benutzer wird eingeben, wie viele Wiederholungen er will, wie viele zählt in jeder Wiederholung, Zeitlücke zwischen zwei zählt.

App zeigt die Anzahl der Wiederholungen an. Wenn alle Wiederholungen beendet sind, stoppt die App den Timer.

Aber ich finde es schwierig. Es sieht so aus, als würde der Timer die for-Schleife ignorieren und ist eine Schleife in sich, die stoppt, wenn wir nur timer.invalidate() ausgeben.

Irgendwelche Gedanken dazu?

for x in 0...HowManyRepetitions { 

       counter = 0 
       CountLabel.text = "\(counter)" 
       RepetitionLabel.text = "\(x)/\(HowManyRepetitions)" 

       for y in 0...HowManyCounts { 

        timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: updateCounter, userInfo: nil, repeats: true) 

       } 

      } 
+0

Ihr Timer eigentlich nichts tun, da es eine Null-Selektor hat. Warum hast du den Timer? – Paulw11

Antwort

1

Die Anzahl der Wiederholungen muss im Timer-Handler verwaltet werden.

Normalerweise behalten Sie den Timer als Instanzeigenschaft. (Möglicherweise müssen Sie den Timer, zum Beispiel ungültig zu machen, wenn viewWillDisappear(_:).)

Also, Sie können so etwas wie dies in Ihrer Klasse schreiben müssen:

var timer: NSTimer? 
func startTimer(howManyCounts: Int, periodBetween: NSTimeInterval) { 
    let userInfo: NSMutableDictionary = [ 
     "counter": 0, 
     "howManyCounts": howManyCounts, 
     "myName": "Timer" 
    ] 
    self.timer = NSTimer.scheduledTimerWithTimeInterval(periodBetween, target: self, selector: #selector(timerHandler), userInfo: userInfo, repeats: true) 
} 

@objc func timerHandler(timer: NSTimer) { 
    guard let info = timer.userInfo as? NSMutableDictionary else { 
     return 
    } 
    var counter = info["counter"] as? Int ?? 0 
    let howManyCounts = info["howManyCounts"] as? Int ?? 0 
    let myName = info["myName"] as? String ?? "Timer" 
    counter += 1 

    print("\(myName):\(counter)") //countLabel.text = "\(counter)" 

    if counter >= howManyCounts { 
     timer.invalidate() 
    } else { 
     info["counter"] = counter 
    } 
} 

die Timer starten von irgendwo in dem Verfahren von die gleiche Klasse wie:

startTimer(10, periodBetween: 3.0) 

ich verstehe nicht, warum Sie äußere Schleife benötigen, aber wenn Sie mehrere Timer arbeiten möchten, müssen Sie alle Timer halten.

var timers: [NSTimer] = [] 
func startTimers(howManyRepetitions: Int, howManyCounts: Int, periodBetween: NSTimeInterval) { 
    timers = [] 
    for x in 1...howManyRepetitions { 
     let userInfo: NSMutableDictionary = [ 
      "counter": 0, 
      "howManyCounts": howManyCounts, 
      "myName": "Timer-\(x)" 
     ] 
     timers.append(NSTimer.scheduledTimerWithTimeInterval(periodBetween, target: self, selector: #selector(timerHandler), userInfo: userInfo, repeats: true)) 
    } 
} 

starten die Timer als:

startTimers(3, howManyCounts: 4, periodBetween: 1.0) 
1

ich denke, dass Ihr Timer außerhalb der Schleife sein sollte.

zum Beispiel:

for x in 0...HowManyRepetitions { 

       counter = 0 
       CountLabel.text = "\(counter)" 
       RepetitionLabel.text = "\(x)/\(HowManyRepetitions)" 

       timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: nil, userInfo: nil, repeats: true) 

       for y in 0...HowManyCounts { 
        // doSomething 
        ... 
       } 

       timer.invalidate() 

      } 
0

Ohne genau zu wissen, was Sie fragen, könnten Sie in der Schleife gesetzt. Mehr Details würden sicherlich helfen.

let param = 0 //IN SCOPE 

for y in 0...HowManyCounts { 

    param++ 

    if param != HowManyCounts{ 
    timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: nil, userInfo: nil, repeats: true) 
    }else{ 
     timer.invalidate() 
    } 

}