Асинхронная очередь, как это работает с этим примером кода - PullRequest
0 голосов
/ 12 декабря 2018

Я написал пример кода для углубления в концепции потоков, как показано ниже.

print("a")
DispatchQueue.global(qos: .default).async {
   print("b")
   DispatchQueue.global(qos: .default).async {
      print("c")
      DispatchQueue.global(qos: .default).async {
        print("d")
        DispatchQueue.global(qos: .default).async {
         print("e")
        }
        print("f")
      }
      print("g")
   }
   print("h")
}
print("i")

OUTPUT

a
i
b
h
c
g
d
f
e

Как выглядит вывод следующим образом.Что на самом деле происходит внутри?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

В каждом контексте DispatchQueue.global делился, и стоимость отправки выше, чем простая печать, вот и все.

0 голосов
/ 12 декабря 2018

Существует два основных поведения:

  1. Поскольку имя подразумевает, что асинхронно отправляемая очередь всегда выполняется после выходящая область - {} - выходит.

    То есть i печатается до b, h печатается до c и т. Д.

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

    Таким образом, последовательный заказ i - b - h - c - g - d - f - e

0 голосов
/ 12 декабря 2018

Идея состоит в том, что любые 2 строки 1 из них

DispatchQueue.global(qos: .default).async

, вторая будет выполняться первой, поэтому

print("a")
DispatchQueue.global(qos: .default).async {  
 print("b")
}
print("i")

дает

a // comes first
i // printed first before queue as the queue dispatches the execution with some delay
b // printed second

Тогдазайти внутрь асинхронного и применить то же правило

   DispatchQueue.global(qos: .default).async {
      print("c")
      DispatchQueue.global(qos: .default).async {  
      print("d")
      }
      print("g")
   }
   print("h")


h

c

g

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