Является ли dispatch_sync (dispatch_get_global_queue (xxx), task) синхронизированным или асинхронным - PullRequest
5 голосов
/ 22 марта 2012

Как говорится в документе Apple, dispatch_get_global_queue () - это параллельная очередь, а dispatch_sync означает что-то последовательное. Затем задачи обрабатываются асинхронно или синхронно?

Ответы [ 2 ]

33 голосов
/ 22 марта 2012

Вы запутались между тем, что такое очередь, и что означает async vs sync.

Очередь - это объект, на котором могут выполняться блоки. Они могут быть последовательными или одновременными. Последовательный означает, что если вы поставите блок в порядке A, B, C, D, то они будут выполнены A, затем B, затем C, затем D. Параллельный означает, что эти же блоки могут быть выполнены в другом порядке и, возможно, даже более одного одновременно (если, конечно, у вас есть несколько ядер для работы).

Затем на асинхронный против синхронизации. Асинхронизация означает, что при вызове dispatch_async он немедленно вернет , и блок будет поставлен в очередь в очереди. Синхронизация означает, что при вызове dispatch_sync он вернется только после завершения выполнения блока.

Таким образом, чтобы полностью ответить на ваш вопрос, если вы dispatch_sync попадете в глобальную параллельную очередь, тогда этот блок будет запущен, возможно, параллельно с другими блоками в этой очереди, но синхронно - т.е. он не вернется до блок закончен.

0 голосов
/ 22 марта 2012

Apple Doc говорит

dispatch_get_global_queue

Возвращает известную глобальную параллельную очередь с заданным приоритетом. уровень.

dispatch_queue_t dispatch_get_global_queue ( долгосрочный приоритет, беззнаковые длинные флаги);

Параметры

priority Приоритет получаемой очереди. Для Список возможных значений см. «dispatch_queue_priority_t». Флаги Это значение зарезервировано для будущего использования. Вы должны всегда проходить 0. Возврат Значение Возвращает запрошенную глобальную очередь.

Обсуждение

Известные глобальные параллельные очереди не могут быть изменены. Вызывает dispatch_suspend, dispatch_resume, dispatch_set_context и подобное не имеет никакого эффекта при использовании с очередями, возвращаемыми этим функция.

Блоки, отправленные в эти глобальные параллельные очереди, могут быть выполнены одновременно по отношению друг к другу.

Доступность Доступно в iOS 4.0 и более поздних версиях. Объявлен в отправка / queue.h

В обсуждении они сказали, что -> 'представленные блоки МОГУТ выполняться одновременно друг с другом.'

Таким образом, задачи могут обрабатываться асинхронно друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...