ios - 等待 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)"
}
}
解决方案
方法不应该是函数调用等待定时器完成,而是定时器应该在它们完成时调用函数。
因此,您需要将下面的函数调用移出viewDidLoad
并将它们放入Timer
块中。
self.gameCountdown(seconds: seconds)
self.displayFinalScore()
即函数调用self.gameCountdown(seconds: seconds)
将进入在开始的计时器块内startCountdown
。在这种情况下,当您在秒变为 0 时使计时器无效时,您调用gameCountdown
.
同样,在开始的计时器中,当秒变为 0 时gameCountdown
调用。self.displayFinalScore
很少有其他建议。您应该避免检查tapMeButtonPressed
. 您应该禁用并启用点击我按钮。即在开始游戏倒计时时启用它,并在结束时禁用它。
同样,您不需要检查displayFinalScore
. 它应该只做一件事,即显示最终分数。
以后会为您省去很多麻烦:)。我的 2 美分。
推荐阅读
- flutter - 我需要按两次按钮才能正常工作(颤动)
- python - 查找给定值的所有键
- javascript - Angular以base64格式获取远程图像URL
- java - Activity does not have a NavController set on
- javascript - Menu closing after going to the related section from the hamburger menu
- flutter - 有没有办法同时拥有一个 floatingActionButton 和一个 SpeedDial?
- android - 从活动调用协程函数返回“只能从协程或另一个挂起函数调用”
- android - 在片段之间传递数据时出错
- kubernetes - Kubernetes 入口路由
- python - Python列出临时变量或单独的项目