iPhone - GCD отправляет асинхронные операции в очередь последовательной отправки - PullRequest
2 голосов
/ 15 февраля 2012

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

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

А как насчет параллельной очереди, будет ли одновременно сгенерированный поток генерировать еще один поток для обработки асинхронной операции?

РЕДАКТИРОВАТЬ: я понимаю, что мой вопрос не очень ясно, поэтому мой вопрос:

Если я использую ту же очередь последовательной отправки, и я отправляю с помощью dispatch_async блок кода, который уже выполняет асинхронную операцию, например NSURLConnection - initWithRequest: делегат: который выполняет асинхронную работу, будет ли блок считаться завершенным последовательным в очереди после асинхронного вызова ?, и будет ли этот асинхронный вызов генерировать еще один поток ?. Или очередь все еще будет ждать завершения задания 1, которое уже асинхронно, перед обработкой второго задания?.

1 Ответ

3 голосов
/ 15 февраля 2012

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

Если вы ставите в очередь с dispatch_async, новый блок просто помещается в конец очереди, функция dispatch_async немедленно возвращается, и вы можете продолжить. Но блок не будет выполнен, пока не будут закончены предыдущие блоки.

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

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

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

...