2014-12-08 2 views
-2

Я создаю очередь GCD, используя dispatch_queue_t q1 = dispatch_queue_create ("com.s1", NULL);Запуск очереди GCD по потоку

и диспетчеризация блок на него с помощью dispatch_async

делают ли GCD какие-либо гарантии на какую нить он запускается? Я замечаю, что он всегда выполняется в фоновом потоке. Есть ли вероятность, что он может быть выполнен в потоке основного/пользовательского интерфейса. Как GCD решает, какой поток работать?

+1

Это то, что вы сказали. Если вам нужна главная очередь, почему вы не попросили основную очередь? Вы попросили новую очередь, у вас ее есть. Очевидно, что новая очередь не является главной очередью; основная очередь уже существует, поэтому она не может быть новой созданной вами очередью. – matt

+0

Рассмотрите возможность чтения документов: https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1 – matt

ответ

5

Нитки не являются очередями, и наоборот.

Когда вы отправляете блоки в очередь GCD, GCD гарантирует, что они будут выполняться в соответствии с правилами этой очереди - поочередно или одновременно, в зависимости от того, как вы создаете очередь. Он не гарантирует, какой поток (и) он будет использовать. Он решает, как управлять вещами в соответствии со своей собственной внутренней логикой. Также не гарантируется, что данная последовательная очередь всегда будет использовать один и тот же поток.

Единственное исключение - главная очередь, полученная по телефону dispatch_get_main_queue. Это очередная очередь, которая запускается в основном потоке.

Если вы создаете свою собственную очередь, блоки, которые выполняются на ней, не будут выполняться в основном потоке/очереди. Какая нить они сделать работать на до GCD.

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