Можешь объяснить, как работает `DispatchSemaphore` в Swift и описать основные варианты использования для управления одновременным доступом к ресурсам? — ДейлиПреп