Skip to content

Commit 52ab4bd

Browse files
authored
Merge pull request #31 from kmatzen/fix/speech-manager-threading
Fix SpeechManager background thread @published update and retain cycle
2 parents a93f6e3 + 30b7bb8 commit 52ab4bd

1 file changed

Lines changed: 12 additions & 5 deletions

File tree

Facett/SpeechManager.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ class SpeechManager: ObservableObject {
7878

7979
recognitionRequest.shouldReportPartialResults = true
8080

81-
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
81+
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { [weak self] result, error in
82+
guard let self = self else { return }
8283
if let result = result {
8384
let segments = result.bestTranscription.segments
8485

@@ -98,14 +99,16 @@ class SpeechManager: ObservableObject {
9899
}
99100

100101
if error != nil || (result?.isFinal ?? false) {
101-
self.stopListening()
102+
DispatchQueue.main.async {
103+
self.stopListening()
104+
}
102105
}
103106
}
104107

105108
let recordingFormat = inputNode.outputFormat(forBus: 0)
106109
inputNode.removeTap(onBus: 0)
107-
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
108-
self.recognitionRequest?.append(buffer)
110+
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { [weak self] buffer, _ in
111+
self?.recognitionRequest?.append(buffer)
109112
}
110113

111114
audioEngine.prepare()
@@ -120,6 +123,10 @@ class SpeechManager: ObservableObject {
120123
audioEngine.inputNode.removeTap(onBus: 0)
121124
recognitionTask = nil
122125
recognitionRequest = nil
123-
isListening = false
126+
if Thread.isMainThread {
127+
isListening = false
128+
} else {
129+
DispatchQueue.main.async { self.isListening = false }
130+
}
124131
}
125132
}

0 commit comments

Comments
 (0)