我正在迅速创建一个琐事应用程序,并且我有一个计时器,可以对每个问题进行计数。但是,随着用户处理每个问题,计时器会加快速度。有人可以帮我解决这个问题吗?
我的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)
}
*/
}
}
答案 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为零,则该代码不执行任何操作。