2014-09-17 2 views
4

В какой поток входит блок в диспетчере_once? Может ли блок dispatch_once работать в фоновом потоке, если код запускается из основного потока? Как обеспечить, чтобы он выполнялся в основном потоке независимо от того, какой поток выполняет его?В какой поток входит блок в диспетчере_once?

ответ

5

Он работает в текущей/вызывающей нити. Если вы хотите, я полагаю, вы могли бы использовать dispatch_sync, чтобы убедиться, что он работает на фоне потока, но я не уверен, что бы вы получили. В общем, он работает в текущем потоке. Если другой поток уже находится в блоке dispatch_once, вызывающий поток будет блокироваться до тех пор, пока блок не завершит выполнение в другом потоке, а затем продолжит.

+2

Начиная с iOS 8/Yosemite, 'dispatch_once' также гарантирует, что поток, фактически выполняющий блок, будет работать с самым высоким QoS (~ приоритетом) среди всех остальных потоков, ожидающих в том же' dispatch_once' для блока заканчивать. – das

+0

Спасибо. Как я могу гарантировать, что он работает в основном потоке? – Boon

+0

Лучший способ гарантировать, что только когда-либо вызывать этот API из основного потока, и в этом случае вам больше не нужно 'dispatch_once'. Другого способа добиться этого не существует. Наиболее очевидная проблема выглядит так: ваш поток BG попадает в 'dispatch_once', затем основной поток также попадает в него; основной поток будет заблокирован, ожидая, когда поток BG выйдет из блока, но поток BG будет заблокирован, ожидая, что основной поток выполнит работу и вернется. Отсюда тупик. – ipmcc

Смежные вопросы