Синхронная обёртка над async-запросом через DispatchSemaphore иногда зависает навсегда
func tokenSync() -> String {
let semaphore = DispatchSemaphore(value: 0)
var token = ""
Task {
token = (try? await auth.freshToken()) ?? ""
semaphore.signal()
}
semaphore.wait()
return token
}
Функцию вызывают из старого кода, в том числе из других async-функций. Под нагрузкой приложение иногда полностью зависает. В чём проблема?
- wait блокирует потоки пула, которые нужны самой задаче
- DispatchSemaphore нельзя создавать с нулём
- signal нужно вызывать до запуска Task
- Нужен semaphore.wait(timeout: .now() + 60)
