dispatch_sync
делает то, что вы думаете - он отправляет блок в назначенную очередь и блокирует текущую очередь, пока блок не будет выполнен. Основная очередь / нить специально не задействуются, если вы не отправляете в нее или из нее.
Таким образом, вы обычно используете его, если операция должна была быть выполнена в другой очереди / потоке - например, операция SQLite или OpenGL - но вы либо нуждались в результате операции, либо просто должны были знать, что операция было завершено с точки зрения функциональности.
Узор:
dispatch_async(otherQueue,
^{
id result = doHardTask();
dispatch_async(originalQueue,
^{
didGetResult(result);
});
});
лучше практиковать, но на самом деле это не то, что вы можете просто приклеить в конце.