Swift timer nie śledzi prawidłowego interwału

Oct 01 2020

Próbuję utworzyć aplikację quizową, która ma licznik czasu dla każdego pytania, kiedy licznik czasu wygaśnie (tj. 10 sekund i chcę Timmermieć interwał 1 sekundy), resetuje go samodzielnie, a następne pytanie jest pobierane i Timmerponownie uruchamiane od 10 .. Ale moim problemem jest to, że licznik czasu nie działa w ustalonym odstępie czasu, gdy ładowane jest pierwsze pytanie, pokazuje interwał 2 ... tj. 10,8,6 ... a następnie dla drugiego pytania wykonuje skok na interwał 3 sekund i podobnie interwał wzrasta.

var countTime = 10.0
func handleNextQuestion() throws {
            nextQuestion()
            if questionCounter == allQuestions.list.count-1{
                finishButton.isHidden = false
                nextButton.isHidden = true
                //scoreLbl.text = "\(score)"
            }
        }
        
        func nextQuestion(){
            showResultView(isCorrect: (question?.isAnswerCorrect)!)
            questionCounter = questionCounter + 1
            question = fetchQuestion()
            setQuizView(question: question!)
            
            
        }
        
        @objc func update() {
            if(countTime > 0) {
                countTime = countTime - 1
                self.countDownLabel.text = String(countTime)
            }else{
                timer.invalidate()
                countTime = 10.0
                do{
    
                    try handleNextQuestion()
    
                }
                catch{
                       moveToResultView()
                }
                
            }
        }
     
        
       
        func startTimer() {
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true)
        }
        func setQuizView(question:Question)  {
            self.countDownLabel.text = "10"
          startTimer()
            startTimer()
            questionLabel.text =  question.questionText
            ansLbl1.text =  question.answer1
            ansLbl2.text =  question.answer2
            ansLbl3.text =  question.answer3
            ansLbl4.text =  question.answer4
            
            if question.selectedAnswer == Constants.DEFAULT_ANSWER {
                for checkBoxItem in checkBoxlist{
                    checkBoxItem.isChecked = false
                }
                
            }
            
        }
        

Odpowiedzi

Tim Oct 01 2020 at 10:12

func setQuizView(question:Question)

dzwoni startTimer()dwa razy. Myślę, że to wyjaśnia zachowanie. Przy każdym nowym pytaniu licznik czasu jest uruchamiany dwukrotnie, ale tylko raz unieważniany, więc sekundy przeskakują o dodatkowe jedno pytanie.

po prostu usuń jedno z połączeń do startTimer()