这个问题可以重新表述为:如果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/