dispatch_async()
означает, что блок поставлен в очередь, а dispatch_async()
возвращается к постановке в очередь другой задачи / блока (возможно) до выполнения блока.
При dispatch_sync()
блок ставится в очередь ифункция не будет продолжать ставить в очередь другую задачу / блок , пока не будет выполнен блок.
Блоки по-прежнему выполняются последовательно.Вы можете выполнить 100 dispatch_async()
вызовов, каждый с блоком, который спит в течение 100 секунд, и это будет очень быстро.Затем выполните вызов dispatch_sync()
в той же последовательной очереди, и dispatch_sync()
вернется через ~ 10 000 секунд.
Проще говоря:
dispatch_async(serialQ, block1);
dispatch_async(serialQ, block2);
dispatch_sync(serialQ, block3);
block1
будет выполнено до block2
, что будет выполнено до block3
.Это порядок, гарантированный последовательной очередью.
Однако вызовы dispatch_async()
могут вернуть до того, как начнет выполняться любой из блоков.dispatch_sync()
будет не возвращаться до того, как будут выполнены все три блока!