Unfortunately I cannot undo the above post marked as answered...
Here is the correct solution with play, pause and stop...
@IBAction func playOrPauseButtonPressed(_ sender: Any) {
timerInterval = habit?.timer
if !play!
{
if (timer == nil)
{
//make new timer
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
//let timer be fired until time interval
if timer.isValid
{
self.secondsElapsed = self.secondsElapsed + 1
let progress = Float(self.secondsElapsed)/Float(self.timerInterval!)
DispatchQueue.main.async() {
self.timerProgressView.setProgress(progress, animated: true)
}
}
else
{
DispatchQueue.main.async() {
self.playOrPauseButton.imageView?.image = UIImage(named: "Play")
}
self.play = false
}
}
}
DispatchQueue.main.async()
{
self.timer?.fire()
//when timer fires show pause button
self.playOrPauseButton.imageView?.image = UIImage(named: "Pause")
}
play = true
}
else
{
DispatchQueue.main.async()
{
self.timer?.invalidate()
self.timer = nil
self.playOrPauseButton.imageView?.image = UIImage(named: "Play")
}
play = false
}
}
@IBAction func stopButtonPressed(_ sender: Any) {
DispatchQueue.main.async()
{
self.timer?.invalidate()
self.timer = nil
self.timerProgressView.setProgress(0, animated: true)
self.playOrPauseButton.imageView?.image = UIImage(named: "Play")
}
play = false
secondsElapsed = 0
}
```
If i set the timer as nil outside the dispatch block, things dont work. dunno why.