Я изучал, как реализовать обратный отсчет Метронома с помощью библиотеки AudioKit, но столкнулся с проблемой, связанной с потоками и моей реализацией.
Моя реализация использует AudioKit AKMetronome
, метод для обработки metronome.start
и обработчик metronome.callback
для запуска recording
после завершения заданного количества тактов.
init () {
metronome.callback = handler
}
func record () {
self.metronome.start()
}
Обработчик вычисляет позицию метронома во времени и, если желаемое количество тактов завершается ( обратный отсчет), рекордер запускается.
К сожалению, выполнение .record
из AKNodeRecorder
в .callback handler
из AKMetronome
вызывает предупреждение:
Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.
По этой причине вызов начала записи в обработчике metronome.callback
передается в основной поток через GCD API:
DispatchQueue.main.sync {
do {
try self.recorder.record()
} catch {
print("[ERROR] Oops! Failed to record...")
}
}
Я использовал метод блокировки .sync
, чтобы разрешить вычисление немедленно, насколько это возможно, поскольку синхронизация имеет решающее значение в аудиоприложениях (в идеале вызов должен выполняться в режиме реального времени); Понимаю ли я, что GCP API main thread
обеспечивает наивысший приоритет, но я не уверен, что это лучший вариант для чувствительных ко времени приложений?
Хотел бы получить отзывы или указания, если это возможно, от другие пользователи, спасибо!