2016-08-08 2 views
1

Люди спрашивают what is the way to run task in an thread. Один из ответов, принятый многими людьми (по ссылке), заключается в использовании GCD.Задача отправки в очередь для запуска задачи в другом потоке

Итак, я попытался таким образом, распечатав идентификатор потока, чтобы увидеть, если задача действительно выполняется в другом потоке после того, как поместить в очередь НОД:

// a function in MyService class  
- (void) doTask { 
     NSLog(@"start do task on thread = %@", [NSThread currentThread]); 
     dispatch_queue_t queue = dispatch_queue_create("com.company.myqueue", DISPATCH_QUEUE_SERIAL); 
     dispatch_sync(queue, ^{ 
      NSLog(@"execute task on thread = %@", [NSThread currentThread]); 
     }); 
    } 

Я бегу:

// this is not main thread [myService doTask]

выход консоли это:

start do task on thread = <NSThread: 0x15b4be00>{number = 6, name = (null)} 
execute task on thread = <NSThread: 0x15b4be00>{number = 6, name = (null)} 

это выглядит как задача НЕ выполняется в другом потоке, она находится в том же потоке, что и поток вызывающего. Я что-то неправильно понимаю? Почему GCD не выполняет задачу в отдельном потоке, но многие pepole принимают ответ в этой ссылке?

+0

, если вы используете dispatch_async, которые они выполняли в другом потоке. –

ответ

1

GCD оптимизирует, когда это возможно. Запуск блока синхронно никогда не требует переключения потоков, за исключением отправки в основную очередь, поскольку это должно выполняться в основном потоке.

0

Попробуйте под кодом, который я взял из Accepted answer, который вы упомянули в своем вопросе.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Add code here to do background processing 
    // 

    NSLog(@"start do task on thread = %@", [NSThread currentThread]); 


    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 

     NSLog(@"execute task on thread = %@", [NSThread currentThread]); 
    }); 
}); 

Он напечатает обе различные нити. В вашем тестовом примере, который вы задали в своем вопросе, тема такая же, и это подход synchronous. Таким образом, он печатает ту же самую нить. Это очень широкая концепция, чтобы объяснить все здесь. Вы должны указать Apple Documentation for GCD.

Документы говорится о dispatch_sync,

Отправляет блок в очередь отправки для синхронного выполнения. В отличие от dispatch_async, эта функция не возвращается, пока блок не закончит. Вызов этой функции и таргетинг на текущую очередь приводит к взаимоблокировке.

В отличие от dispatch_async, у цели нет удержания очереди. Поскольку вызовы этой функции синхронны, она «заимствует» ссылку вызывающего абонента. Более того, на блоке блока Block_copy не выполняется.

> В качестве оптимизации эта функция вызывает, когда это возможно, блок на текущем потоке .

0

Проверить это

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dispatch_get_global_queue.3.html

Он говорит, что

Очередь не связана с какой-либо конкретной темой исполнения и блоков, представленных в независимые очереди могут выполняться одновременно.

Таким образом, выбор резьбы для выполнения задачи определяется алгоритмами вытягивания нити, используемыми диспетчером lib.но дает гарантии, что выполнение очередей выполняется с учетом конфигурации очереди (последовательной или параллельной и другой)

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