В чем преимущество использования dispatch_sync, если он должен ждать завершения основного потока? - PullRequest
9 голосов
/ 27 февраля 2012

Зачем кому-то использовать dispatch_sync, если блок должен ждать, пока не закончится основной поток.В чем преимущество использования этой функции вместо написания кода в строке (неблокированный и вне Grand Central Dispatch).Возможно, я неправильно понимаю, что на самом деле делает dispatch_sync.Спасибо.

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012

dispatch_sync делает то, что вы думаете - он отправляет блок в назначенную очередь и блокирует текущую очередь, пока блок не будет выполнен. Основная очередь / нить специально не задействуются, если вы не отправляете в нее или из нее.

Таким образом, вы обычно используете его, если операция должна была быть выполнена в другой очереди / потоке - например, операция SQLite или OpenGL - но вы либо нуждались в результате операции, либо просто должны были знать, что операция было завершено с точки зрения функциональности.

Узор:

    dispatch_async(otherQueue,
    ^{
           id result = doHardTask();

           dispatch_async(originalQueue,
               ^{
                     didGetResult(result);
               });
    });

лучше практиковать, но на самом деле это не то, что вы можете просто приклеить в конце.

0 голосов
/ 28 февраля 2012

Вы можете использовать dispatch_async для запуска параллельной очереди, а в блоке, связанном с этим вызовом, вы можете использовать dispatch_sync для запуска ряда задач во второй очереди.Все это происходит без блокировки основной очереди.

...