这个问题可以重新表述为:如果2秒过去而没有事件(重新)发生,如何调用函数?
我在玩SFSpeechRecogniser。当用户说话时,它会连续发送更新(可能每秒2-3次)。我正在尝试检测用户何时停止说话。如果我在2秒钟内没有收到任何更新,我可以假设用户已经暂停了讲话。
如何在Swift中实现这一点?
我知道我可以做到:

var timer : Timer?

func f() {
    on_event = { result, error in
        print( "Got event, restarting timer" )
        self.timer?.invalidate()
        self.timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { _ in
            print( "2s inactivity detected" )
            self.timer?.invalidate()
            NotificationCenter.default.post( name: inactivity_notification,  object: nil )
        }
    }
}

但是,在不重复创建和销毁计时器实例的情况下(从而创建大量永远不会被使用的临时计时器实例),是否有可能做到这一点?

最佳答案

一种方法是:
记录事件发生的当前时间
使用您熟悉的粒度(例如0.25秒)设置循环计时器。
当计时器弹出时,检查当前时间和上次事件时间之间的差异。如果大于2秒,则启动通知。
如果我必须意识到一个人已经停止打字2秒,我就会这么做。以打字速度使计时器失效和创建计时器将是一个很大的麻烦。你可以根据你的需求来调整它,这取决于你需要多接近精确的2秒。
您也可以只使用一个timeSinceLastEvent变量来实现这一点,并在事件发生时将其设置为0。循环计时器将按粒度递增此值,并检查其是否已达到2秒,如果达到则触发通知。这比计算时间更粗糙,因为计时器的间隔不能保证,但更简单。

关于swift - 如何快速检测(说)2秒钟的静止状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57153713/

10-12 15:52