Browse Source

修复超时检查不起作用

newdev_shunjiawei
liwei1dao 10 months ago
parent
commit
46c8143bba
  1. 29
      local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift

29
local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift

@ -386,40 +386,29 @@ class AgentServiceImpl: NSObject {
} }
private func startIdleCheck(idleSeconds: TimeInterval = 10) { private func startIdleCheck(idleSeconds: TimeInterval = 10) {
// 2. 所有对idleTimer的操作都通过串行队列执行,避免竞态条件
timerQueue.async { timerQueue.async {
// 先停止旧的定时器(在串行队列中执行,确保线程安全) if self.idleTimer != nil {
self.stopIdleCheck() self.idleTimer?.cancel()
self.idleTimer = nil
}
guard self.isRecognizing else { return } guard self.isRecognizing else { return }
os_log("启动空闲检测,超时时间: %.0f秒,模式: %{public}@", os_log("启动空闲检测,超时时间: %.0f秒,模式: %{public}@",
log: self.logger, log: self.logger,
type: .info, type: .info,
idleSeconds, idleSeconds,
self.currentRecognitionMode) self.currentRecognitionMode)
// 使用全局队列作为定时器回调队列(避免后台挂起)
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global(qos: .utility)) let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global(qos: .utility))
timer.schedule(deadline: .now() + idleSeconds) timer.schedule(deadline: .now() + idleSeconds)
timer.setEventHandler { [weak self] in timer.setEventHandler { [weak self] in
guard let self = self else { return } guard let self = self else { return }
// 回调在全局队列,涉及UI或实例变量操作时切换到主线程
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in
guard let self = self else { return } guard let self = self else { return }
os_log("空闲检测触发自动停止,模式: %{public}@",
// 检查状态(确保在主线程访问这些属性,避免UI相关竞态) log: self.logger,
type: .info,
self.currentRecognitionMode)
if self.isRecognizing && !self.isSpeaking && !self.isAiStreaming { if self.isRecognizing && !self.isSpeaking && !self.isAiStreaming {
os_log("空闲检测触发自动停止,模式: %{public}@",
log: self.logger,
type: .info,
self.currentRecognitionMode)
// 关闭编码器(设备侧操作,若BleService线程安全可直接调用,否则需加锁)
BleService.shared.closeCodec() BleService.shared.closeCodec()
self.stopRecognition() self.stopRecognition()
self.sendEvent(name: "auto_stop", data: [ self.sendEvent(name: "auto_stop", data: [
"reason": "idle_timeout", "reason": "idle_timeout",
@ -429,9 +418,7 @@ class AgentServiceImpl: NSObject {
} }
} }
} }
timer.resume() timer.resume()
// 3. 在串行队列中安全赋值
self.idleTimer = timer self.idleTimer = timer
} }
} }

Loading…
Cancel
Save