Разница между типами DispatchQueue в Swift - PullRequest
0 голосов
/ 02 октября 2018

Как я понимаю, в Swift есть 3 типа DispatchQueue:

  • Основной (последовательный) (Основной поток)
  • Глобальный (одновременный) (Фоновые потоки, работающие параллельно)
  • Пользовательский (параллельный или последовательный)

И каждый из них может работать (асинхронно или синхронно)

Первый вопрос:

Это основная очередь, работающая на только для пользовательского интерфейса и не работающая на другом потоке?Если ответ да, то как DispatchQueue.Main.async не блокирует поток пользовательского интерфейса.Если ответ «Нет», какая польза от использования DispatchQueue.global до тех пор, пока DispatchQueue.Main.async работает в другом потоке.

Второй вопрос:

В чем разница между DispatchQueue.global (async) и DispatchQueue.global (синхронизация) до тех пор, пока эта очередь работает Параллельно и где использовать каждую из них?

Третий вопрос:

что такое разница между

  1. (последовательный и синхронный)
  2. (одновременный и асинхронный)

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Как я понимаю:

Очередь не является потоком

Основная и глобальная очередь могут работать в одном потоке

Отправлено : означает поставить задачу в очередь

Если Глобальная очередь отправлено в Основная очередь как Синхронизация , отправленная задачабудет работать в том же потоке Основная очередь и отправленная задача добавлена ​​в Глобальная очередь , И эта задача заморозит поток

Если Глобальная очередь отправлена ​​в Основная очередь как Асинхронная , отправленная задача будет работать в другом потоке Основная очередь и отправленаЗадача добавлена ​​в Глобальная очередь , И эта задача не остановит поток

Если Основная очередь отправлена ​​в Основная очередь как асинхронная , отправленная задача будет работать в том же потоке Основная очередь

Если Основная очередь dispatched in Основная очередь , поскольку синхронизация сделает исключение, потому что make deadlock

Dispatch.sync : поставить задачу в очередь и дождаться ее завершения

Dispatch.async : поставить задачу в очередь и не ждать ее завершения (задача может работать в том же потоке или в другом потоке)

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

  • Если задача отправляется в основную очередь и это согласие из основного потока, то задача будет добавлена ​​в основную очередь и не будет работать сразу, пока не закончатся работы более старых задач в очереди (поскольку основная очередь является последовательной)

0 голосов
/ 02 октября 2018

DispatchQueue не соответствуют ни одному потоку напрямую.Единственное ограничение - доступ к пользовательскому интерфейсу разрешен только из основного потока, что можно сделать через DispatchQueue.main.Однако нет гарантии, что система отправит ваш блок выполнения в определенный поток, если вы вызовете его в определенной очереди.

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

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

...