Как этот абзац неправильно? Подсчитаем пути:
Для любой задачи, которая не включает в себя пользовательский интерфейс, вы можете использовать глобальные одновременных очередей в ГКД.
Это слишком специфично и неточно. Определенные задачи пользовательского интерфейса, такие как загрузка изображений, могут выполняться с основного потока. Это было бы лучше сказать как «В большинстве случаев не взаимодействовать с классами UIKit
, кроме основного потока», но есть исключения (например, рисование на UIGraphicsContext
является потокобезопасным с iOS 4, IIRC и рисунком является отличным примером задачи с интенсивным процессором, которая может быть выгружена в фоновый поток.) FWIW - любое рабочее устройство, которое вы можете отправить в глобальную параллельную очередь, вы также можете отправить в приватную параллельную очередь.
Они допускают либо синхронное, либо асинхронное выполнение. Но синхронное выполнение не означает, что ваша программа ждет кода до , прежде чем продолжить. Это просто означает, что параллельная очередь будет ждать завершения вашей задачи до того, как она перейдет к следующему блоку кода в очереди.
Как предполагают iWasRobbed, они, похоже, имеют объединенную синхронизацию/асинхронную работу с последовательными/параллельными очередями. Синхронное выполнение делает, по определению, означает, что ваша программа ждет возврата кода перед продолжением. Асинхронное выполнение, по определению, означает, что ваша программа не ждет. Аналогично, очереди серийно выполняют только один поданный рабочий блок за раз, выполняя каждый в порядке FIFO. Параллельные очереди, частные или глобальные, в общем случае (больше в секунду), расписали представленные блоки для выполнения в том порядке, в котором они были установлены в очередь, на один или несколько фоновых потоков. Количество используемых фоновых потоков - непрозрачная деталь реализации.
Когда вы помещаете объект блока на параллельную очереди, ваша собственная программа всегда продолжается прямо сейчас, не дожидаясь очереди, чтобы выполнить коды.
Nope. Не правда. Опять же, они смешивают синхронизацию/асинхронную и последовательную/параллельную. Я подозреваю, что они пытаются сказать: когда вы вставляете асинхронный блок, ваша собственная программа всегда остается незамеченной, не дожидаясь очереди для выполнения кода.
Это связано с тем, что параллельные очереди, как следует из их названия, запускают свой код в потоках, отличных от основного потока.
Это еще неверно. Например, если у вас есть приватная параллельная очередь, которую вы используете, чтобы действовать как блокировка чтения/записи, которая защищает какое-то изменяемое состояние, если вы dispatch_sync
в эту очередь из основного потока, ваш код во многих случаях будет выполнять основная нить.
В целом, весь этот параграф действительно довольно ужасен и вводит в заблуждение.
EDIT: Я упомянул об этом в комментарии к другому ответу, но было бы полезно поместить его здесь для ясности. Понятие «синхронная и асинхронная диспетчеризация» и концепция «последовательных или параллельных очередей» в основном ортогональны. Вы можете отправлять работу в любую очередь (последовательную или параллельную) либо синхронно, либо асинхронно. Синхронная/асинхронная дихотомия в первую очередь относится к «отправке» er * »(при этом она определяет, заблокирован ли диспетчер до завершения блока или нет), тогда как параллельная/параллельная дихотомия в первую очередь относится к отправке * ee * блок (в котором он определяет, может ли диспетчер потенциально выполняться одновременно с другими блоками или нет).
Было бы более точно сказать, что в параллельной задаче очереди все еще * начаты * в порядке FIFO/enqueuing, но они могут быть эффективно * закончены * в любом порядке, в зависимости от ряда факторов. – ipmcc
И я согласен; это довольно страшный абзац, полный фактических неточностей. – ipmcc
@ipmcc Уточненный, спасибо! – iwasrobbed