为什么我的计时器迅速保持加速?

时间:2018-11-06 22:08:21

标签: swift timer

我正在迅速创建一个琐事应用程序,并且我有一个计时器,可以对每个问题进行计数。但是,随着用户处理每个问题,计时器会加快速度。有人可以帮我解决这个问题吗?

我的runGameTimer函数:

try (final IndexReader reader = DirectoryReader.open(index)) {

    final IndexSearcher searcher = new IndexSearcher(reader);
    final DuplicateFilter duplicateFilter = new DuplicateFilter(LuceneUtils.LUCENE_DOCUMENT_TITLE);
    duplicateFilter.setKeepMode(DuplicateFilter.KeepMode.KM_USE_LAST_OCCURRENCE);

    final ScoreDoc[] scoreDocs = searcher.search(query, duplicateFilter, limit).scoreDocs;

    final List<Document> documents = new ArrayList<>();
    for (ScoreDoc scoreDoc : scoreDocs) {

        final int docId = scoreDoc.doc;
        final Document document = searcher.doc(docId);
        documents.add(document);
    }
}

我的updateGameTimer函数:

func runGameTimer()
{
    gameTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(RockTriviaViewController.updateGameTimer), userInfo: nil, repeats: true)

}

我在哪里调用我的代码:

@objc func updateGameTimer()
{
    gameInt -= 1
    timerLabel.text = String(gameInt)
    if (gameInt == 0)
    {
        gameTimer.invalidate()
      /*
        if (currentQuestion != rockQuestions[questionSet].count)
        {
            newQuestion()
        }
        else
        {
            performSegue(withIdentifier: "showRockScore", sender: self)
        }
       */
    }
}

1 个答案:

答案 0 :(得分:1)

您每次致电runGameTimer()时都呼叫newQuestion()。如果一个计时器已经在运行,那么您每次都会添加一个新计时器,它们都会调用您的选择器。因此,如果您有3个计时器在运行,那么选择器的调用频率将是3x。那不是你想要的。

将您的计时器变量更改为weak

weak var gameTimer: Timer?

然后在runGameTimer中使用可选的链接使计时器无效,然后再创建新计时器:

func runGameTimer() {
    gameTimer?.invalidate() //This will do nothing if gameTimer is nil.
                            //it will also cause the gameTimer to be nil since it's weak.

    gameTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(RockTriviaViewController.updateGameTimer), userInfo: nil, repeats: true)
}

通过使游戏计时器变弱,它将在无效后立即设置为nil。 (当您安排计时器时,系统会在运行时保留它,因此只要它继续运行,它就一直有效。)

通过使用可选链接来引用计时器:

gameTimer?.invalidate()

如果gameTimer为零,则该代码不执行任何操作。