Как гарантировать, что любой DispatchQueue (или OperationQueue) будет работать только в неосновном потоке для асинхронных задач? - PullRequest
0 голосов
/ 26 января 2019

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

Типичный обходной путь для этой ситуации - пропустить задачу, если текущий поток обнаружен как основной поток. Но это приводит к бесполезному использованию системных ресурсов и создает ненужные сложности. Я считаю, что должен быть декларативный способ сделать это.

Есть ли лучший способ? У меня есть задачи различного размера, которые не должны выполняться в главном потоке. Я пытался порождать отдельный поток, но это не сработало, потому что в macOS отсутствует безымянный семафор. Хотя DispatchSemaphore реализован с использованием безымянных семафоров, я не уверен, безопасно ли использовать DispatchSemaphore с вещами pthread, поскольку это объект уровня GCD.

1 Ответ

0 голосов
/ 26 января 2019

Пока что лучшим способом было бы установить уровень качества обслуживания в фоновом режиме.

Согласно этому документу ;

... система запускает элементы в потоке, приоритет которого установлен для фонового состояния. ...

И в этом документе говорится, что для QoS по умолчанию в "основном потоке" установлено значение "интерактивное для пользователей" для приложений с графическим интерфейсом.

... В приложении основной поток работает на уровне QoS, интерактивном для пользователя. ...

Неясно, можно ли изменить уровень QoS позже. В любом случае, с настройками по умолчанию система не будет отправлять задачи GCD с более низким уровнем QoS в основной поток. Если такого потока нет, система создаст новый.

Это мои мысли, и я до сих пор не нашел явного упоминания об этом в официальных документах.

...