В заголовке вы спрашиваете:
можно ли вызвать основной поток semaphore.wait ()?
Вам следует избегать блокирования основного потока по любой причине,wait
для семафоров или групп рассылки, или даже синхронная диспетчеризация (например, sync
) чего-либо более чем несколько миллисекунд.Вы рискуете, если процесс сторожевого таймера убьет ваше приложение, если вы сделаете это в неподходящее время, и это приведет к ужасному UX.
Затем вы спросите:
DispatchQueue.main.async {
let semaphore = DispatchSemaphore(value: 0)
semaphore.wait()
}
Приведенный выше код заморозит приложение.
Могу ли я узнать причину
Этот код говорит: «заблокируйте основной поток, ожидающий signal
на этом семафоре».Таким образом, до тех пор, пока не наступит signal
, основной поток будет заблокирован.Но главный поток никогда не должен блокироваться, потому что он обслуживает, помимо прочего, пользовательский интерфейс, и ваше приложение будет зависать, если вы заблокируете основной поток.
В итоге, никогда не блокируйте основной поток.