С Grand Central Dispatch можно легко выполнять трудоемкую задачу по не основному потоку, избегать блокировки основного ада и поддерживать интерфейс отзывчивый. Просто используя dispatch_async
и выполните задачу в глобальной параллельной очереди.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// code
});
Однако, что-то звучит слишком хорошо, чтобы быть правдой, как этот, обычно имеют недостаток. После того, как мы много используем это в нашем проекте приложений iOS, недавно мы обнаружили, что на нем существует ограничение на 64 потока. Как только мы достигнем предела, приложение замерзнет/повиснет. При приостановке приложения с помощью Xcode мы видим, что основной поток поддерживается semaphore_wait_trap
.
Googling в Интернете подтверждает, что другие тоже сталкиваются с этой проблемой, но до сих пор не найдено ни одного решения.
Достигнут лимит жестких дисков Dispatch: 64 (слишком много потоков отправки заблокирован в синхронных операциях)
qaru.site/info/194100/..., подтверждает, что эта проблема возникает при использовании dispatch_sync
и dispatch_barrier_async
тоже.
Вопрос:
Поскольку Grand Central Dispatch имеет ограничение на 64 потока, существует ли какое-либо обходное решение для этого?
Спасибо заранее!