Swift 为什么我的计时器选择器触发两次(RunLoop)?

Swift 为什么我的计时器选择器触发两次(RunLoop)?,swift,timer,nsrunloop,Swift,Timer,Nsrunloop,我继承了一些用于检测词尾的代码 ... recognitionRequest.shouldReportPartialResults = true recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in if result != nil { if self.eosTimer != nil {

我继承了一些用于检测词尾的代码

...
recognitionRequest.shouldReportPartialResults = true 
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in

    if result != nil {

        if self.eosTimer != nil {
            self.eosTimer!.invalidate()
            self.eosTimer = nil
        }
        self.eosTimer = Timer(timeInterval: 2.0, target: self, selector: #selector(self.timerHasCompleted(timer:)), userInfo: nil, repeats: false)
        RunLoop.current.add(self.eosTimer!, forMode: .commonModes)
    }
    ...

我假设这是因为计时器被添加到了RunLoop中。如果不这样做,计时器根本不会启动。如何使eosTimer只启动一次?

您已指定
shouldReportPartialResults
。所以这可能会被多次调用。至于为什么需要添加,那是因为您使用的是计时器(…),它只创建计时器,而不安排它。如果您使用创建它,则不必调用
add
。即使使用schedule(可以正常工作),我仍然会让计时器触发两次。我需要部分结果,因为每次我得到一个段结果时,我想使计时器失效。当2秒没有结果发生时,我知道已经发生了语音输入。我不知道为什么计时器选择器被调用了两次。它被调用的间隔是否超过了两秒?我建议在创建计时器时使用
NSLog
,并在选择器中使用
NSLog
,以便您可以准确确认计时器的创建时间和触发时间。归根结底,计时器不只是自己发射多次。你必须有一些允许这样做的流程。或者你有一些东西直接调用
timerHasCompleted
。但问题不在于计时器本身,而在于你如何称呼它。这里没有足够的内容来重现/诊断问题。我认为发生的是计时器被反复清除,我停止说话,计时器启动,2秒后再次启动,因为任务在2秒以上的时间返回相同的结果。这有点奇怪。所以我用了一个BOOL变量来检查。它是在选择器中设置的,因此计时器现在只触发一次,因为它只能在选择器尚未触发时创建。我不确定我能不能说这是一个答案。