Пока что я не нашел упоминаний об этой функции. AFAIK, по определению, любая очередь GCD может выполняться в основном потоке. Если GCDQ с какой-то тяжелой задачей выбирает основной поток для выполнения, это повлияет на что-то плохое для пользовательского интерфейса. (Я говорю о DispatchQueue.async
случае)
Типичный обходной путь для этой ситуации - пропустить задачу, если текущий поток обнаружен как основной поток. Но это приводит к бесполезному использованию системных ресурсов и создает ненужные сложности. Я считаю, что должен быть декларативный способ сделать это.
Есть ли лучший способ? У меня есть задачи различного размера, которые не должны выполняться в главном потоке. Я пытался порождать отдельный поток, но это не сработало, потому что в macOS отсутствует безымянный семафор. Хотя DispatchSemaphore
реализован с использованием безымянных семафоров, я не уверен, безопасно ли использовать DispatchSemaphore
с вещами pthread, поскольку это объект уровня GCD.