首页 > 解决方案 > 等待 Swift 计时器完成

问题描述

所以我在 swift 5 上做一个简单的游戏,我基本上有一个 3..2..1.. go 计时器来开始游戏,然后有一个 3..2..1..stop 计时器来停止游戏。最后是一个显示分数的函数。我需要一种方法让每个函数调用在下一个开始之前等待计时器完成,有什么建议吗?到目前为止,这是我的代码。(另外,如果您对应用程序有任何其他建议,请告诉我,最终目标是记录您可以在 3 秒内点击按钮的次数)

var seconds = 3 //Starting seconds
var countDownTimer = Timer()
var gameTimer = Timer()
var numberOfTaps = 0

override func viewDidLoad() {
    super.viewDidLoad()

    self.startCountdown(seconds: seconds)
    self.gameCountdown(seconds: seconds)
    self.displayFinalScore()


}

func startCountdown(seconds: Int) {
        countDownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
            self?.seconds -= 1
            if self?.seconds == 0 {
                self?.countdownLabel.text = "Go!"
                timer.invalidate()
            } else if let seconds = self?.seconds {
                self?.countdownLabel.text = "\(seconds)"
            }
        }
}

func gameCountdown(seconds: Int) {
        gameTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
              self?.seconds -= 1
              if self?.seconds == 0 {
                  self?.countdownLabel.text = "Stop!"
                  timer.invalidate()
              } else if let seconds = self?.seconds {
                  self?.countdownLabel.text = "\(seconds)"
              }
          }
  }


    deinit {
        // ViewController going away.  Kill the timer.
        countDownTimer.invalidate()
    }




@IBOutlet weak var countdownLabel: UILabel!


@IBAction func tapMeButtonPressed(_ sender: UIButton) {
    if gameTimer.isValid {
        numberOfTaps += 1
    }
}

func displayFinalScore() {
    if !gameTimer.isValid && !countDownTimer.isValid {
        countdownLabel.text = "\(numberOfTaps)"
    }
}

标签: iosswifttimerwaitswift5

解决方案


方法不应该是函数调用等待定时器完成,而是定时器应该在它们完成时调用函数。

因此,您需要将下面的函数调用移出viewDidLoad并将它们放入Timer块中。

self.gameCountdown(seconds: seconds)
self.displayFinalScore() 

即函数调用self.gameCountdown(seconds: seconds)将进入在开始的计时器块内startCountdown。在这种情况下,当您在秒变为 0 时使计时器无效时,您调用gameCountdown.

同样,在开始的计时器中,当秒变为 0 时gameCountdown调用。self.displayFinalScore

很少有其他建议。您应该避免检查tapMeButtonPressed. 您应该禁用并启用点击我按钮。即在开始游戏倒计时时启用它,并在结束时禁用它。

同样,您不需要检查displayFinalScore. 它应该只做一件事,即显示最终分数。

以后会为您省去很多麻烦:)。我的 2 美分。


推荐阅读