Вступить в клуб →
сложнаявопросSwift Concurrency: Task, акторы и MainActor

Синхронная обёртка над 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)

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела