UIButton动作中的DispatchQueue.main.asyncAfter可能存在的Bug,当按钮被spammedrapidly和重复按下时。

问题描述 投票:1回答:1

该项目可以在这里克隆 https:/github.comrandomjuniorburgerquizapp。

我有一个UIButton,链接到一个使用DispatchQueue.main.asyncAfter的动作。除了当用户滥用TrueFalse按钮或在很短的时间间隔内连续多次触发其中一个按钮,导致延迟重叠,并允许用户获得比预期更高的分数(例如,只有8个问题的答案是 "True",但由于如果滥用True按钮的bug,10分是可能的),该应用程序运行良好。

我想知道如何才能避免这种情况的发生?

NB - 我是一个初学者。这个项目是我尝试重新创建Angela Yu的课程的一个模块。

我欢迎任何关于如何改进我的代码和更接近最佳实践的建议。

单单是按钮的代码就是。

@IBAction func answerPressed(_ sender: UIButton) {

    let userAnswer = sender.currentTitle
    let actualAnswer = quizArray[questionNumber].answer

    if questionNumber < (quizArray.count - 1) {
        self.questionNumber += 1
        updateProgressBar()
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.questionLabel.text = self.quizArray[self.questionNumber].text
        }

        if userAnswer == actualAnswer {
            questionLabel.text = "✅"
            score += 1
            scoreLabel.text = String("Score: \(score) / 12")

        } else {
            questionLabel.text = "❌"
        }

    } else if questionNumber == (quizArray.count - 1) && questionLabel.text != "End of Quiz" {
        if userAnswer == actualAnswer {
            questionLabel.text = "✅"
            score += 1
            scoreLabel.text = String("Score: \(score) / 12")
        } else {
            questionLabel.text = "❌"
        }

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.progressBar.progress = Float(1)
            print("No more questions")
            self.questionLabel.text = "End of Quiz"
        }
    }

}
swift uibutton storyboard swift5 dispatch-async
1个回答
0
投票

这里是可能的解决方案--只是不给用户生成不需要的点击的可能性。

sender.isEnabled = false // don't allow action until question updated
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    self.questionLabel.text = self.quizArray[self.questionNumber].text
    sender.isEnabled = true // << allow user interaction
}

退而求其次

© www.soinside.com 2019 - 2024. All rights reserved.